数组的比较,菜鸟求指点
int a[] = {1,4,8,9,2,6,5,7,3};
int b[] = new int[a.length];
System.arraycopy(a, 0, b, 0, a.length);//把 a copy 到 b 上
/* 下面两个比较,得出结果不同,是怎么个原因? */
System.out.println(a.equals(b));// 输出:false
System.out.println(Arrays.equals(a, b));// 输出:true
------解决方案--------------------System.out.println(Arrays.equals(a, b));// 输出:true
比较的是两个数组的内容
System.out.println(a.equals(b));// 输出:false
比较的是两个数组对象
可以查看api文档啊
------解决方案--------------------1、Arrays.equals(a, b),这条语句中的equals,它是判断两个数组的值是否相同。显然相同。
2、a.equals(b),这里的equals是判断两个数组的引用地址是否相等。显然不同的。
3、a.equals(b),假如a,b是String类型的话,那么这个equals却是判断值是否相同。在JDK中,String类型重写了从Object类继承的equals方法,方法实现也改变了,这个需要注意!
------解决方案--------------------在java中数组是一个对象,数组这个对象没有对equals这个方法进行重写,所以数组对象在调用equals的时候,使用的是Object的equals方法,查看源码,可以看出,Object的equals方法如下:
public boolean equals(Object obj) {
return (this == obj);
}
很明显,Object的euqals对象返回的结果是,两个对象的引用是否相同,也就是说,这两个对象是否是一个对象。在此程序中,你创建了两个对象,很明显,它俩的元素值即便相同,也绝对不是一个对象,所以返回的肯定是false。
而Arrays.equals(a,b)源码如下:
public static boolean equals(int[] a, int[] a2) {
if (a==a2)
return true;
if (a==null
------解决方案-------------------- a2==null)
return false;
int length = a.length;
if (a2.length != length)
return false;
for (int i=0; i<length; i++)
if (a[i] != a2[i])
return false;
return true;
}
根据源码看出,很明显如果两个数组的长度一样,并且,对应位置的元素值一样,返回的就是true。所以此程序中Arrays.equals(a, b)返回的肯定是true。