比较两个列表(作为字符串)似乎永远不匹配

时间:2012-05-26 18:54:03

标签: java arrays

我不知道我做错了什么,我有两个项目列表,我试图比较它们。

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但我永远不会得到匹配。

3 个答案:

答案 0 :(得分:4)

equals()上使用String (请参阅the exact definition here), ==按引用进行比较即,你所拥有的两个引用指向内存中的完全相同的对象),不是按值你可能在内存中有多个具有相同内容的字符串实例< / em>的)。

你需要的是:

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

字符串可能是优化的,也可能不是,你永远无法确定(好吧,在某些情况下由JLS定义,例如,当两个字符串在同一个编译单元中定义时,它们的值完全相同而没有任何额外的编译时验证,它们将使用相同的引用,但使用例如"ab""a" + "b"可能是相同或不同的引用,基于您的操作系统,JVM版本,内部版本号,宇宙的当前状态等。)。

请参阅其他一些注释herehere

答案 1 :(得分:2)

使用==比较对象(哪些字符串)会检查它们是完全相同的对象。换句话说,它们指的是内存中的相同位置。您想要使用.equals()方法。

答案 2 :(得分: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)))