2012-05-26 21 views
1

我不知道我在做什麼錯,我有兩個項目列表,並試圖比較他們兩個。比較兩個列表(作爲字符串)從未似乎匹配

private static void check_results(ArrayList<int[]> result2, int[] reversedList) { 
    //check results list for matches 
    System.out.println(); 
    for (int[] item : result2) { 
     System.out.println(Arrays.toString(item) + " compared to " + Arrays.toString(reversedList)); 
     if (Arrays.toString(item) == Arrays.toString(reversedList)) 
     { 
      System.out.println("we have a match!"); 
     } 
    } 

} 

但我似乎從來沒有匹配。當我明顯地比較時,我可以看到他們是比賽。

[0, 0, 0, 20] compared to [0, 0, 0, 20] 
... and so on 

我在做什麼錯?我知道result2作爲一個ArrayList開始,但我重複認爲它是一個int[]就像我的變量reversedList,但我從來沒有得到一個匹配。

回答

4

String使用equals()(見the exact definition here),==比較參照即兩個參考你都指向完全相同的對象在內存),不是值你可能在內存中具有多個字符串實例,具有相同的內容)。

你需要的是這樣的:

if (Arrays.toString(item).equals(Arrays.toString(reversedList))) { ... } 

字符串可能進行優化,也可能不會,你永遠無法知道肯定(OK,在由JLS定義某些情況下,例如,當定義了兩個字符串在相同的編譯單元中,它們的值完全相同,沒有任何額外的編譯時驗證,它們將使用相同的引用,但使用例如"ab""a" + "b"可能是相同或不同的引用,基於您的OS,JVM版本,內部版本號,宇宙的當前狀態等)。請參閱herehere

2

使用==比較對象(字符串是)檢查它們是完全相同的對象。換句話說,他們指的是內存中的相同位置。您想改爲使用.equals()方法。

2

不要拿String==它比較的(String)引用有意義的對比使用equalsequalsIgnoreCase方法的對象。

而不是

if (Arrays.toString(item) == Arrays.toString(reversedList)) 

使用此:

if (Arrays.toString(item).equals(Arrays.toString(reversedList))) 

或者這個,如果你想區分大小寫的比較

if (Arrays.toString(item).equalsIgnoreCase(Arrays.toString(reversedList))) 
相關問題