【问题标题】:Java: .contains and .equalsJava:.contains 和 .equals
【发布时间】:2012-02-20 23:55:01
【问题描述】:

我正在尝试执行一个程序,以比较两个链表中的元素。 一种方法是,我可以通过执行两个 for 循环并迭代两个列表,使用 .equals() 将 list1 中的每个元素与 list2 进行比较。 另一种方法是,只需遍历第一个列表并检查 list1.contains(list1.get(i)) .. 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++; }

【问题讨论】:

  • 考虑查看源代码。
  • 无需使用for循环来检查列表中是否存在元素。
  • 我要检查第一个列表中的每个元素是否在第二个列表中都很漂亮。基本上,拾取重叠的元素。

标签: java equals contains


【解决方案1】:

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

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

【讨论】:

  • 这是有道理的。如果你看到我的代码,是的。我想这可能是一个原因,为什么运行时间更长。是的,我知道,还有其他各种方法,但我专门尝试了这种情况。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2015-07-20
    • 2014-06-24
    • 2020-02-25
    • 2011-12-21
    • 2020-07-18
    • 2018-01-08
    • 2012-03-08
    • 2015-03-17
    • 2019-06-02
    相关资源
    最近更新 更多