日期:2014-05-20  浏览次数:20761 次

数组的比较,菜鸟求指点
        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
java

------解决方案--------------------
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。