2012-01-28 121 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