действует как хэш-карта. фактически каждый объект ActionScript, который является экземпляром динамического класса, действует как hashmap. конечно ключи всегда могут конфликтовать со свойствами. это поведение происходит из JavaScript. Я считаю это неудачей проекта.
Массив отличается тем, что он выполняет некоторые трюки с целочисленными ключами, а Словарь отличается тем, что он не преобразует ключи в строки, но использует любое значение объекта в качестве ключа. Обратите внимание, что 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 {}
}
}