[英]Comparing two LinkedList<String> with ListIterator versus for loop and get(int index)
我有兩個始終具有相同大小的LinkedList對象。 我想比較它們,看看它們的內容是否相同。 為每個列表創建ListIterator並使用while hasNext循環與使用計數器(int i)並使用linkedlist.get(i)從0迭代到linkedlist.size()來獲取和比較的一般性能和樣式含義是什么?價值? 有沒有更好的方式讓我俯瞰?
我唯一能想到的是ListIterator方法可能更好,因為我以后可以更容易地交換另一個Comparable列表(而不是我計划它)。 我不知道兩者在引擎蓋下是什么樣的,所以我不確定如何比較它們的性能。
事實證明, AbstractList.equals()
( LinkedList
使用)將自動執行此操作,因此使用它。 代碼是:
public boolean equals(Object o) {
if (o == this)
return true;
if (!(o instanceof List))
return false;
ListIterator<E> e1 = listIterator();
ListIterator e2 = ((List) o).listIterator();
while (e1.hasNext() && e2.hasNext()) {
E o1 = e1.next();
Object o2 = e2.next();
if (!(o1 == null ? o2 == null : o1.equals(o2)))
return false;
}
return !(e1.hasNext() || e2.hasNext());
}
所以不要重新發明輪子。
最后一點:不要使用get(index)
迭代LinkedList
。 它是O(n)訪問(對於ArrayList
O(1))所以使用get(index)
的LinkedList
遍歷將是O(n 2 )。
對LinkedList
隨機訪問具有可怕的性能(它需要從一端開始並重復調用next
或類似),因此ListIterator
會更快。
對於擴展AbstractSequentialList
類,鏈接列表的get(n)
不是常量操作; 這是O(n)
。 來自AbstractSequentialList#get(int index) :
此實現首先獲取指向索引元素的列表迭代器(使用
listIterator(index)
)。 然后,它使用ListIterator.next
獲取元素並返回它。
通常,您不希望對未實現標記接口java.util.RandomAccess
集合執行隨機訪問。
根據經驗,如果對於類的典型實例,此循環,List實現應實現此接口:
for (int i=0, n=list.size(); i < n; i++) list.get(i);
運行速度比這個循環快:
for (Iterator i=list.iterator(); i.hasNext(); ) i.next();
從Java SE 6開始,實現類是ArrayList, AttributeList, CopyOnWriteArrayList, RoleList, RoleUnresolvedList, Stack, Vector
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.