ActionScript-3: Array vs. ArrayList - PullRequest
       11

ActionScript-3: Array vs. ArrayList

2 голосов
/ 30 августа 2010

Кто-нибудь может мне сказать, что быстрее: Array или ArrayList?(ActionScript3)

Я пытался найти страницу об этом, но ничего не нашел.Спасибо.

Ответы [ 3 ]

7 голосов
/ 30 августа 2010

Класс ArrayList представляет собой простую реализацию IList, в которой в качестве источника данных используется отступ Array. К элементам в резервном массиве можно обращаться и манипулировать с помощью методов и свойств интерфейса IList. Операции с экземпляром ArrayList изменяют источник данных; например, если вы используете метод removeItemAt() для ArrayList, вы удаляете элемент из базового Array.

Очевидно, класс ArrayList оборачивает объект Array - следовательно, простой Array будет быстрее, чем объект ArrayList.

4 голосов
/ 31 августа 2010

Как уже говорилось, массив работает быстрее.На самом деле это на порядки быстрее.

Эквивалентами доступа к массиву являются getItemAt и setItemAt.

Реализация:

public function getItemAt(index:int, prefetch:int = 0):Object
{
    if (index < 0 || index >= length)
    {
        var message:String = resourceManager.getString(
            "collections", "outOfBounds", [ index ]);
        throw new RangeError(message);
    }

    return source[index];
}

и:

public function setItemAt(item:Object, index:int):Object
{
    if (index < 0 || index >= length) 
    {
        var message:String = resourceManager.getString(
            "collections", "outOfBounds", [ index ]);
        throw new RangeError(message);
    }

    var oldItem:Object = source[index];
    source[index] = item;
    stopTrackUpdates(oldItem);
    startTrackUpdates(item);

    //dispatch the appropriate events 
    if (_dispatchEvents == 0)
    {
        var hasCollectionListener:Boolean = 
            hasEventListener(CollectionEvent.COLLECTION_CHANGE);
        var hasPropertyListener:Boolean = 
            hasEventListener(PropertyChangeEvent.PROPERTY_CHANGE);
        var updateInfo:PropertyChangeEvent; 

        if (hasCollectionListener || hasPropertyListener)
        {
            updateInfo = new PropertyChangeEvent(PropertyChangeEvent.PROPERTY_CHANGE);
            updateInfo.kind = PropertyChangeEventKind.UPDATE;
            updateInfo.oldValue = oldItem;
            updateInfo.newValue = item;
            updateInfo.property = index;
        }

        if (hasCollectionListener)
        {
            var event:CollectionEvent =
                new CollectionEvent(CollectionEvent.COLLECTION_CHANGE);
            event.kind = CollectionEventKind.REPLACE;
            event.location = index;
            event.items.push(updateInfo);
            dispatchEvent(event);
        }

        if (hasPropertyListener)
        {
            dispatchEvent(updateInfo);
        }
    }
    return oldItem;    
}

Здесь задействовано множество вызовов и проверок.Обратите внимание, что _dispatchEvents == 0 - это true по умолчанию (если вы не disableEvents), поэтому запись на самом деле является огромной операцией.

Однако ArrayList предоставляет множество функций, которые полезныв пределах гибкогоХорошим компромиссом является захват базового Array (доступного как ArrayList::source), выполнение ваших операций, а затем переназначение его (если у вас есть слушатели, наблюдающие этот массив).

Кроме того, если вы используете FlashИгрок 10, тогда Vector превзойдет Array.

greetz
back2dos

2 голосов
/ 30 августа 2010

Массив, вероятно, немного быстрее или они равны. ArrayList - это реализация iList, использующая массив Array в качестве вспомогательного объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...