Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 ActionScript3字典是hashmap吗?_Actionscript 3_Hashtable_Hashmap - Fatal编程技术网

Actionscript 3 ActionScript3字典是hashmap吗?

Actionscript 3 ActionScript3字典是hashmap吗?,actionscript-3,hashtable,hashmap,Actionscript 3,Hashtable,Hashmap,词典满足了我的需要,但我确实需要关注性能。有人知道字典是否实现为哈希表吗 或者更具体地说,它是否在O(1)中执行?关联数组上的adobe文档似乎暗示字典是哈希映射: 您可以使用Dictionary类创建一个关联数组,该数组使用对象作为键而不是字符串。这种数组有时称为Dictionary、Hash或maps 它充当哈希映射。事实上,作为动态类实例的每个ActionScript对象都充当hashmap。当然,关键点总是会与属性发生冲突。这种行为来自JavaScript。我认为这是设计失败。 数组的不

词典满足了我的需要,但我确实需要关注性能。有人知道字典是否实现为哈希表吗


或者更具体地说,它是否在O(1)中执行?

关联数组上的adobe文档似乎暗示字典是哈希映射:

您可以使用Dictionary类创建一个关联数组,该数组使用对象作为键而不是字符串。这种数组有时称为Dictionary、Hash或maps


它充当哈希映射。事实上,作为动态类实例的每个ActionScript对象都充当hashmap。当然,关键点总是会与属性发生冲突。这种行为来自JavaScript。我认为这是设计失败。

数组的不同之处在于它会对整数键执行一些技巧,而字典的不同之处在于它不会将键转换为字符串,而是使用任何对象值作为键。请注意,数字和布尔值都转换为字符串

现在你为什么要关心它是如何实现的?如果它得到了很好的实现,您可能不想知道。您可以对其进行基准测试。它对所有操作都有O(1),并且速度相当快(插入的时间大约是空方法调用的两倍,删除的时间更少)。任何替代方案的实施都将更加缓慢

这里是一个简单的基准测试(请确保编译后发布,并在正确的播放器中运行):

包{
导入flash.display.Sprite;
导入flash.text.TextField;
导入flash.utils。*;
公共类基准扩展了Sprite{
公共职能基准(){
var txt:TextField=new TextField();
这个.addChild(txt);
txt.text=“等待…”;
txt.width=600;
常数重复:int=20;
常数计数:int=100000;
var d:Dictionary=newdictionary();
变量j:int,i:int;
变量键:数组=[];
对于(j=0;j
不,不是。java哈希映射基于哈希代码,而Dictionary基于键的严格相等性
(==)
,因此,如果计划将对象作为键放置,则不能使用

java:

class MyStuff {
  public final int id;

  MyStuff(int i) {
    this.id = i;
  }
  public int hashCode() {
    return this.id;
  }
  public int equals(MyStuff o) {
    return (this.id - o.id);
  }
}

Map<MyStuff, Object> m1 = new HashMap<MyStuff, Object>();
m1.put(new MyStuff(1),  new Object());
assert(m1.get(new MyStuff(1)) != null); //true
class MyStuff {
  public var id:Number;

  public function MyStuff(i:Number):void {
    this.id = i;
  }
  //no notion of hashCode or equals in AS3 Object class,
  //so we can't really control how the Objects are compared.
}

var d:Dictionary = new Dictionary();
d[new MyStuff(1)] = {};
trace(d[new MyStuff(1)]); //outputs null

我正在研究在AS3中实现哈希的正确方法,但它看起来确实非常没有希望……

看看这个:@George Profenza:尽管它很好,但它完全是一种过度使用。为什么要重新实现本机已经存在的东西?@back2dos你是对的。不过,这要视情况而定。我没建议用那个,只是想看看。因为ashmap应该像Java一样工作,所以使用它应该很容易,所以对于快速而肮脏的工作来说,应该可以。对于速度关键型代码和保持对整个代码的控制,理解和使用Dictionary对象是前进的方向。我添加了一条评论,而不是答案,因为这是额外的东西,不是真正的答案。谢谢你告诉我我不清楚的地方。谢谢,非常有用。我想知道,因为我必须决定是使用这个类还是使用另一个hashmap类(如果不是的话)。我可以描述它是的,但知道它是否是哈希映射更容易。@Bart van Heukelom:我很高兴能提供帮助。我仍然认为“实现为Hashmap”是指“实现为java.util.Hashmap”。答案是,我不知道。可能不会。Java Hashmap经过优化,可以在JVM上运行良好。在FlashPlayer中,此mechanizm是本机的,完全透明。如果实现发生了变化,或者依赖于平台,我不会感到惊讶。唯一可以肯定的是,它的作用与通常定义的哈希表完全相同,O(1)也用于插入/删除。很抱歉造成混淆,我的意思是在下面的一般回答中作为哈希表-它不是哈希映射,因为它不使用哈希。java.util.Hashmap是一个Hashmap。对象不是,假设它是,可能会导致一些很难找到的错误。@Phil:我在哪里说过它是哈希映射或它使用哈希?你是唯一一个敢于对它的实施做出绝对声明的人。严格的平等对我来说是好的。我在做游戏,自然对象与实例的比例为1:1,这与ORM情况不同。我更关心的是随机访问的性能。假设严格相等,对象在内存中的地址可以作为它的哈希代码。AFAIK ActionScript代码无法获得该值,但本机Flash实现不会有问题。
class MyStuff {
  public var id:Number;

  public function MyStuff(i:Number):void {
    this.id = i;
  }
  //no notion of hashCode or equals in AS3 Object class,
  //so we can't really control how the Objects are compared.
}

var d:Dictionary = new Dictionary();
d[new MyStuff(1)] = {};
trace(d[new MyStuff(1)]); //outputs null