ActionScript-3:Array与ArrayList

时间:2010-08-30 09:33:20

标签: flex actionscript-3

有人能说我更快吗:Array还是ArrayList? (的ActionScript3)

我试图找到一个关于此的页面,但没有找到任何内容。 谢谢。

3 个答案:

答案 0 :(得分:7)

  

ArrayList classIList的一个简单实现,它使用支持Array作为数据源。可以使用IList接口的方法和属性访问和操作后备阵列中的项目。 ArrayList实例上的操作修改数据源;例如,如果您在removeItemAt()上使用ArrayList方法,则会从基础Array中删除该项目。

显然,ArrayList类包装了一个Array对象 - 因此一个普通的Array会比一个ArrayList对象更快。

答案 1 :(得分:4)

如前所述,Array更快。实际上它要快几个数量级。

数组访问的等价物是getItemAtsetItemAt

实现:

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确实提供了许多功能,这些功能在flex中非常有用。一个好的组合是获取基础Array(可以作为ArrayList::source访问),执行操作,然后重新分配它(假设您有监听器观察该数组)。

此外,如果你使用Flash Player 10,那么Vector将胜过Array。

格尔茨
back2dos

答案 2 :(得分:2)

数组可能稍快或相同。所有的ArrayList都是iList的一个实现,它使用... Array作为后备对象。