簡體   English   中英

遍歷鏈接列表的差異

[英]Differences in iterating over Linked Lists

我知道使用迭代通過LinkedList

for(int i = 0; i < list.size(); i++){
  Item item = list.get(i);
}

獲取單個對象的性能很差,因為每次調用.get(i)都會從列表的開頭一直迭代到i。

正確的方法是使用迭代器。 到現在為止還挺好。

但是這種風格呢:

for(Item item : list){
  // item is already here
}

它具有與使用迭代器相同的性能嗎? 這在內部如何運作?

它具有與使用迭代器相同的性能嗎?

是。 兩種變體都生成相同的字節碼。 以下字節碼是從for-each-loop中生成的,但是在循環中使用迭代器時,它看起來完全相同:

for(Object o : list) {
}

  44: aload_1
  45: invokevirtual #30                 // Method java/util/LinkedList.iterator:()Ljava/util/Iterator;
  48: astore_3
  49: goto          59
  52: aload_3
  53: invokeinterface #34,  1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
  58: astore_2
  59: aload_3
  60: invokeinterface #40,  1           // InterfaceMethod java/util/Iterator.hasNext:()Z
  65: ifne          52

這在內部如何運作?

對於非數組,for-each-loop在內部使用Iterators。 參見上面的字節碼-所有方法都被調用,使用Iterator時也會被調用。

另請參見每次循環Java“ for each”循環如何工作? 有關其他信息。

foreach循環使用Iterable接口。 它調用iterator()然后使用迭代器進行迭代。 數組使用特殊處理。

當您不想更改列表的size時,每個循環的用途是不同的。 因為它使用iterators而變得invalidateresize的list.Whereas的它不是在正常的loop.But的情況下的standard loop請調用size每一次,這使得它效率較低則函數for each 為了獲得相同的性能,您需要在standard loop條件下放置10,15,.. etc等constant

  • 對於每個-只讀模式

  • 標准-讀寫

特定於該問題的問題:for循環的標准確實效率很低,因為每次從頭開始調用get時都必須遍歷列表,這比調用size更為麻煩

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM