起因是学了稀疏数组的压缩和还原后,顺手用了个Arrays.equals()比较,返回false。这两个数组一摸一样,为什么返回false,去看了Arrays.equals()方法的源码发现没法比较二维数组。
public static boolean equals(int[] a, int[] a2) {
if (a==a2)
return true; //1.如果名字相同,返回true
if (a==null || a2==null)
return false; //2.如果其中一个为空,返回false
int length = a.length;
if (a2.length != length)
return false; //3.如果两个数组长度不同,返回false
for (int i=0; i<length; i++)
if (a[i] != a2[i])
return false; //4.每一个元素进行对比,如果有一个不同,返回false
return true; //5.走到这一步就说明数组中每个元素都相等,返回true
}
如果输入比较的是两个二维数组,在第4步中就会返回false,因为拿出来对比的是哈希值或者内存地址(这个地方我不是很清楚),并不是数组中的元素。
就有了下面的代码
public static boolean arrayEquals(int[][] array1,int[][] array2){
if (array1==array2)
return true;
if (array1==null || array2==null)
return false;
if (array1.length != array2.length)
return false;
if (array1[0].length != array2[0].length)
return false;
for (int i = 0; i < array1.length; i++) { //二维数组中的每个数组使用equals方法比较
if (Arrays.equals(array1[i],array2[i])==false)
return false; //有一个为false,返回false
}
return true;
}
全部代码
public static void main(String[] args) {
int[][] array1=new int[5][6];
int[][] array2=new int[6][6];
int[][] array3=new int[6][5];
int[][] array4=new int[5][6];
System.out.println("array1和array2是否相等:"+arrayEquals(array1,array2));
System.out.println("array1和array3是否相等:"+arrayEquals(array1,array3));
System.out.println("array1和array4是否相等:"+arrayEquals(array1,array4));
System.out.println("array2和array3是否相等:"+arrayEquals(array2,array3));
System.out.println("array2和array4是否相等:"+arrayEquals(array2,array4));
System.out.println("array3和array4是否相等:"+arrayEquals(array3,array4));
}
/**
* Array.equals()比较两个二维数组是否相同
* @author apple_pile
* @param array1
* @param array2
* @return boolean
*/
public static boolean arrayEquals(int[][] array1,int[][] array2){
if (array1==array2)
return true;
if (array1==null || array2==null)
return false;
if (array1.length != array2.length)
return false;
if (array1[0].length != array2[0].length)
return false;
for (int i = 0; i < array1.length; i++) { //二维数组中的每个数组使用equals方法比较
if (Arrays.equals(array1[i],array2[i])==false)
return false; //有一个为false,返回false
}
return true;
}
}