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

3 回答 3

4

使用equals()onString(请参见此处的确切定义),==按引用比较即,您拥有的两个引用指向内存中完全相同的对象),而不是按值内存中可能有多个字符串实例具有相同的内容) .

你需要的是这样的:

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

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

请参阅此处此处的一些附加说明。

于 2012-05-26T18:55:25.650 回答
2

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

于 2012-05-26T18:55:52.140 回答
2

Don't compare Stringwith ==it 比较 ( 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))) 
于 2012-05-26T18:56:38.473 回答