[英]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
而變得invalidate
后resize
的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.