2012-01-28 43 views
5

我想执行一个程序,比较两个链接列表中的元素。我可以做到这一点是通过执行两个for循环并迭代两个列表,使用.equals()将list1中的每个元素与list2进行比较。 另一种方法是,只是迭代第一个列表并检查list1.contains(list1.get(i)) .. java文档说,.contains在内部执行.equals。 如果是这样的话,与前者相比,前者的运行时间是多长? 我误解了文档吗?如果我这样做了,当我使用内部比较时,究竟是如何包含?Java:.contains和.equals

  using equals: 
      for (int i = 0; i < list_one.size(); i++) { 
       for (int j = 0; j < list_one.size(); j++) { 
        if (list_one.get(i).equals(list_two.get(j))) { count++; } 

      using contains: 
      for (int i = 0; i < list_one.size(); i++) { 
       if (list_two.contains(list_one.get(i)) == true) { count++; } 
+2

请考虑查看源代码。 – 2012-01-28 03:27:04

+0

无需使用for循环来检查元素是否存在或不在列表中。 – adatapost 2012-01-28 03:30:14

+0

我必须检查第一个列表中的每个元素是否都在第二个列表中。基本上,拿起重叠的元素。 – madCode 2012-01-28 03:31:54

回答

1

我想,看到get(i)您使用在两个循环get(j)。在效率低下的链表中。 for (String s1 : list1) for (String s2 : list2) ...应该与contains具有相同的速度。

例如get(3)需要从第一个元素开始,接下来的三次链接。而for-each使用指向下一个元素的迭代器。

5

contains的实现将停止迭代一次equals返回true,因此如果您要查找的元素位于列表开头的某处,它将不会遍历整个列表。如果你的版本没有这样做,那就可以解释为什么它会变慢。

PS:无论哪种方式,运行时间仍然是二次方。有更聪明的方法可以解决这个问题,不需要通过第二个列表遍历第一个列表中的每个项目(例如,首先对两个列表进行排序或使用一个集合)。

+0

这是有道理的。如果你看到我的代码,是的。我想这可能是一个原因,为什么运行时间更长。是的,我知道,还有其他各种方式,但我特别试图这种情况。 – madCode 2012-01-28 03:46:35