我正在尝试执行一个程序,以便将两个链表中的元素相互比较。 一种方法,我可以这样做是通过执行两个for循环并迭代两个列表比较list1中的每个元素与list2使用.equals()。 另一种方法是,只是迭代第一个列表并检查list1.contains(list1.get(i)) .. java文档说,.contains在内部执行.equals。 如果是这样的话,与后者相比,前者的运行时间是多长? 我误解了文档吗?如果我这样做,当我使用contains时,内部比较究竟是如何发生的?
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++; }
答案 0 :(得分:5)
contains
的实现将在equals
返回true后停止迭代,因此如果您要查找的元素位于列表开头的某个位置,它不会迭代整个列表。如果您的版本没有这样做,那就可以解释为什么它的速度较慢。
PS:无论哪种方式,运行时间仍然是二次方的。有更聪明的方法来解决这个问题,不涉及在第一个列表中为每个项目迭代第二个列表(例如,首先对两个列表进行排序或使用集合)。
答案 1 :(得分:1)
我认为,看到get(i)
您在两个循环中都使用get(j)
。在链接列表中效率低下。 for (String s1 : list1) for (String s2 : list2) ...
的速度应与contains
相同。
例如,get(3)需要从第一个元素开始,将链接带到接下来的三个元素。而for-each使用指向下一个元素的迭代器。