Ответ 1
он действует как хэшмап. фактически, каждый объект ActionScript, являющийся экземпляром динамического класса, действует как hashmap. конечно ключи всегда могут столкнуться со свойствами. это поведение происходит от JavaScript. Я считаю это ошибкой дизайна.
Array отличается тем, что он будет выполнять некоторые трюки на целочисленных ключах, а словарь отличается тем, что он не преобразует ключи в строки, а использует любое значение объекта в качестве ключа. Обратите внимание, что Number и Boolean преобразуются в String.
теперь, почему вам все равно, как это реализовано? если он хорошо реализован, вы, вероятно, не хотите знать. Вы можете сравнить его. Он имеет O (1) для всех операций и является достаточно быстрым (вставка затрат примерно в два раза больше, чем пустой вызов метода, исключая затраты). Любая альтернативная реализация будет медленнее.
здесь простой тест (обязательно скомпилируйте его для выпуска и запустите его в правом проигрывателе):
package {
import flash.display.Sprite;
import flash.text.TextField;
import flash.utils.*;
public class Benchmark extends Sprite {
public function Benchmark() {
var txt:TextField = new TextField();
this.addChild(txt);
txt.text = "waiting ...";
txt.width = 600;
const repeat:int = 20;
const count:int = 100000;
var d:Dictionary = new Dictionary();
var j:int, i:int;
var keys:Array = [];
for (j = 0; j < repeat * count; j++) {
keys[j] = { k:j };
}
setTimeout(function ():void {
var idx:int = 0;
var out:Array = [];
for (j = 0; j < repeat; j++) {
var start:int = getTimer();
for (i = 0; i < count; i++) {
d[keys[idx++]] = i;
}
out.push(getTimer() - start);
}
txt.appendText("\n" + out);
start = getTimer();
for (var k:int = 0; k < i; k++) {
test();
}
txt.appendText("\ncall:"+(getTimer() - start));
idx = 0;
out = [];
for (j = 0; j < repeat; j++) {
start = getTimer();
i = 0;
for (i = 0; i < count; i++) {
delete d[keys[idx++]];
}
out.push(getTimer() - start);
}
txt.appendText("\n" + out);
},3000);//wait for player to warm up a little
}
private function test():void {}
}
}