Use deepEquals(Object[], Object[]) http://java.sun.com/javase/6/docs/api/java/util/Arrays.html#deepEquals%28java.lang.Object%5B%5D,%20java.lang.Object%5B%5D%29.
Returns true
如果两个指定的数组是深度平等彼此。
自从int[]
is an instanceof Object
, an int[][]
is an instanceof Object[]
.
As to why Arrays.equals
对于二维数组不起作用,可以逐步解释如下:
对于数组来说,equals
根据对象身份定义
System.out.println(
(new int[] {1,2}).equals(new int[] {1,2})
); // prints "false"
这是因为数组继承了它们的equals
来自他们共同的超类,Object http://java.sun.com/javase/6/docs/api/java/lang/Object.html#equals%28java.lang.Object%29.
当然,通常我们确实希望数组的值相等,这就是为什么java.util.Arrays
提供了static
实用方法equals(int[], int[])
.
System.out.println(
java.util.Arrays.equals(
new int[] {1,2},
new int[] {1,2}
)
); // prints "true"
Java 中的数组数组
- An
int[]
is an instanceof Object
- An
int[][]
is an instanceof Object[]
- An
int[][]
is NOT an instanceof int[]
Java 并没有真正的二维数组。它甚至没有真正的多维数组。 Java 有数组的数组。
java.util.Arrays.equals
是“浅”
现在考虑这个片段:
System.out.println(
java.util.Arrays.equals(
new int[][] {
{ 1 },
{ 2, 3 },
},
new int[][] {
{ 1 },
{ 2, 3 },
}
)
); // prints "false"
以下是事实:
- Each argument is an
Object[]
- 索引 0 处的元素是
int[] { 1 }
- 索引 1 处的元素是
int[] { 2, 3 }
.
- 那里有两个
Object[]
实例
- 有四个
int[]
实例
从上一点应该可以清楚地看出,这会调用Arrays.equals(Object[], Object[]) http://java.sun.com/javase/6/docs/api/java/util/Arrays.html#equals%28java.lang.Object%5B%5D,%20java.lang.Object%5B%5D%29超载。从API:
Returns true
如果两个指定的数组Objects
彼此相等。考虑两个数组equal
如果两个数组包含相同数量的元素,并且两个数组中所有对应的元素对都相等。两个物体e1
and e2
被认为是相等的,如果(e1==null ? e2==null : e1.equals(e2))
.
现在应该清楚为什么上面的代码片段会打印了"false"
;这是因为Object[]
根据上面的定义,数组不相等(因为int[]
有它的equals
由对象标识定义)。
java.util.Arrays.deepEquals
是“深”
相比之下,这是Arrays.deepEquals(Object[], Object[]) http://java.sun.com/javase/6/docs/api/java/util/Arrays.html#deepEquals%28java.lang.Object%5B%5D,%20java.lang.Object%5B%5D%29 does:
Returns true
如果两个指定的数组是deeply彼此平等。不像equals(Object[],Object[])
方法,此方法适用于任意深度的嵌套数组。
System.out.println(
java.util.Arrays.deepEquals(
new int[][] {
{ 1 },
{ 2, 3 },
},
new int[][] {
{ 1 },
{ 2, 3 },
}
)
); // prints "true"
On Arrays.toString
and Arrays.deepToString
值得注意的是这两种方法与我们迄今为止讨论的有关嵌套数组的类比。
System.out.println(
java.util.Arrays.toString(
new int[][] {
{ 1 },
{ 2, 3 },
}
)
); // prints "[[I@187aeca, [I@e48e1b]"
System.out.println(
java.util.Arrays.deepToString(
new int[][] {
{ 1 },
{ 2, 3 },
}
)
); // prints "[[1], [2, 3]]"
同样,推理是相似的:Arrays.toString(Object[])
将每个元素视为Object
,然后调用它的toString()
方法。数组继承它的toString()
来自他们共同的超类Object
.
如果你想java.util.Arrays
要考虑嵌套数组,您需要使用deepToString
,就像你需要使用deepEquals
.