2010-08-30 133 views
2

有人可以說我更快:Array還是ArrayList? (ActionScript3)ActionScript-3:Array與ArrayList

我試圖找到關於此的一個頁面,但沒有找到任何東西。 謝謝。

+0

你有沒有做過一些測試案例,看看有什麼更快? – 2010-08-30 09:42:42

回答

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

+0

+1表示:-) – Amarghosh 2010-08-31 03:43:01

7

ArrayList class是一個簡單的實現,其使用的背襯Array作爲數據的源IList。可以使用IList接口的方法和屬性訪問和操作後備陣列中的項目。對ArrayList實例的操作修改數據源;例如,如果您在ArrayList上使用removeItemAt()方法,則會從基礎Array中刪除該項目。

顯然ArrayList類包裝一個數組對象 - 因此一個普通的數組將比一個ArrayList對象更快。

2

數組可能稍快或者它們相等。 ArrayList是一個iList的實現,它使用... Array作爲後臺對象。