使用deepEquals(Object[], Object[])
。
如果两个指定的数组彼此深度相等,则返回true
。
由于int[]
是Object
的实例,int[][]
是Object[]
的实例。
至于为什么Arrays.equals
不适用于二维数组,可以分步解释如下:
对于数组,equals
是基于对象标识定义的
System.out.println(
(new int[] {1,2}).equals(new int[] {1,2})
)
这是因为数组从它们的共同超类
Object
继承了它们的
equals
。
当然,通常我们真正想要的是数组的值相等,这就是为什么
java.util.Arrays
提供了
static
实用程序方法
equals(int[], int[])
的原因。
System.out.println(
java.util.Arrays.equals(
new int[] {1,2},
new int[] {1,2}
)
);
Java中的数组嵌套
int[]
是 Object
的一个实例
int[][]
是 Object[]
的一个实例
int[][]
不是 int[]
的一个实例
Java 实际上没有二维数组。它甚至没有真正的多维数组。Java 有的是数组的数组。
java.util.Arrays.equals
是“浅层比较”
现在考虑下面这个代码片段:
System.out.println(
java.util.Arrays.equals(
new int[][] {
{ 1 },
{ 2, 3 },
},
new int[][] {
{ 1 },
{ 2, 3 },
}
)
);
以下是事实:
- 每个参数都是一个
Object[]
类型的
- 索引0处的元素是
int[] {1}
- 索引1处的元素是
int[] {2, 3}
- 有两个
Object[]
实例
- 有四个
int[]
实例
前面的内容清楚地说明了这会调用Arrays.equals(Object[], Object[])
。从API中可以看出:
如果两个指定的Objects
数组彼此相等,则返回true
。 如果两个数组包含相同数量的元素,并且两个数组中对应元素的值都相等,则认为这两个数组是相等的。如果两个对象e1
和e2
相等,则e1.equals(e2)
应该返回true
;如果e1==null
,则e2 == null
。
现在就能够明白为什么上述代码片段输出"false"
了;因为Object[]
数组的元素按照上述定义不相等(因为int[]
使用对象标识定义其equals
方法)。
java.util.Arrays.deepEquals
是"深度"的
相比较而言,这里是Arrays.deepEquals(Object[], Object[])
的功能:
如果两个指定的数组在深层次上相等,则返回true
。与equals(Object[],Object[])
方法不同,此方法适用于任意深度的嵌套数组。
System.out.println(
java.util.Arrays.deepEquals(
new int[][] {
{ 1 },
{ 2, 3 },
},
new int[][] {
{ 1 },
{ 2, 3 },
}
)
);
关于
Arrays.toString
和
Arrays.deepToString
值得注意的是,这两种方法与我们之前讨论的嵌套数组的类比关系。
System.out.println(
java.util.Arrays.toString(
new int[][] {
{ 1 },
{ 2, 3 },
}
)
);
System.out.println(
java.util.Arrays.deepToString(
new int[][] {
{ 1 },
{ 2, 3 },
}
)
);
同样的道理,Arrays.toString(Object[])
将每个元素都视为Object
,并调用其toString()
方法。数组继承了它们共同超类Object
的toString()
。
如果你想让java.util.Arrays
考虑嵌套数组,你需要使用deepToString
,就像你需要使用deepEquals
一样。