我不知道我做错了什么,我有两个项目列表,我试图比较它们。
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
但我永远不会得到匹配。
答案 0 :(得分:4)
在equals()
上使用String
(请参阅the exact definition here), ==
按引用进行比较(即,你所拥有的两个引用指向内存中的完全相同的对象),不是按值(你可能在内存中有多个具有相同内容的字符串实例< / em>的)。
你需要的是:
if ( Arrays.toString(item).equals( Arrays.toString(reversedList) )) { ... }
字符串可能是优化的,也可能不是,你永远无法确定(好吧,在某些情况下由JLS定义,例如,当两个字符串在同一个编译单元中定义时,它们的值完全相同而没有任何额外的编译时验证,它们将使用相同的引用,但使用例如"ab"
和"a" + "b"
可能是相同或不同的引用,基于您的操作系统,JVM版本,内部版本号,宇宙的当前状态等。)。
答案 1 :(得分:2)
使用==
比较对象(哪些字符串)会检查它们是完全相同的对象。换句话说,它们指的是内存中的相同位置。您想要使用.equals()
方法。
答案 2 :(得分:2)
请勿将String
与==
进行比较,以便比较(String
)个对象的引用,以便进行有意义的比较使用equals
或equalsIgnoreCase
方法。
而不是
if ( Arrays.toString(item) == Arrays.toString(reversedList))
使用此:
if (Arrays.toString(item).equals(Arrays.toString(reversedList)))
或者如果您想要不区分大小写的比较
if (Arrays.toString(item).equalsIgnoreCase(Arrays.toString(reversedList)))