比较两个LinkedList <String>和ListIterator与for循环和get(int index)

msi*_*ver 7 java comparison linked-list

我有两个始终具有相同大小的LinkedList对象.我想比较它们,看看它们的内容是否相同.为每个列表创建ListIterator并使用while hasNext循环与使用计数器(int i)并使用linkedlist.get(i)从0迭代到linkedlist.size()来获取和比较的一般性能和样式含义是什么?价值?有没有更好的方式让我俯瞰?

我唯一能想到的是ListIterator方法可能更好,因为我以后可以更容易地交换另一个Comparable列表(而不是我计划它).我不知道两者在引擎盖下是什么样的,所以我不确定如何比较它们的性能.

cle*_*tus 7

事实证明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());
}
Run Code Online (Sandbox Code Playgroud)

所以不要重新发明轮子.

最后一点说明:不要get(index)用来迭代a LinkedList.它是O(n)访问(对于ArrayLista 来说是O(1))所以LinkedList遍历使用get(index)将是O(n 2).


Han*_*Gay 5

随机访问LinkedList具有可怕的性能(它需要从一端开始并next重复调用或类似),因此ListIterator会更快.

  • 谢谢,这完全有道理.我也意识到我忽略了使用list1.equals(list2)的可能性,根据API,它应该具有预期的行为(我认为它们是用迭代器实现的). (2认同)