簡體   English   中英

比較兩個LinkedList <String> 使用ListIterator與for循環和get(int index)

[英]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.

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