【问题标题】:Comparing two LinkedList<String> with ListIterator versus for loop and get(int index)比较两个 LinkedList<String> 与 ListIterator 与 for 循环和 get(int index)
【发布时间】:2010-02-24 03:29:57
【问题描述】:

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

我唯一能想到的是 ListIterator 方法可能更好,因为我以后可以更轻松地换入另一个 Comparable 列表(不是我计划的)。我不知道这两者在幕后是什么样子,所以我不确定如何比较它们的性能。

【问题讨论】:

    标签: java comparison linked-list


    【解决方案1】:

    事实证明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(n2)。

    【讨论】:

    • 谢谢。这与我使用的类似。
    • 当两个列表的大小不同时,立即返回 false 而不是最后一个条件返回不是更好吗?
    • 是的,我认为快速检查大小将是一个好主意,以防止首先遍历不同大小的列表。很好的收获。
    【解决方案2】:

    LinkedList 的随机访问性能很差(它需要从一端开始并反复调用next 或类似方法),因此ListIterator 会更快。

    【讨论】:

    • 谢谢,这完全有道理。我也刚刚意识到我忽略了使用 list1.equals(list2) 的可能性,根据 API,它应该具有预期的行为(我假设他们使用迭代器实现了它)。
    【解决方案3】:

    get(n) 用于链表不是扩展 AbstractSequentialList 的类的常量操作;这是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

    【讨论】:

      猜你喜欢
      • 2012-04-18
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      • 2018-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多