/*
2008年8月22日17:10:04
一个有关equals()的问题
*/import java.util.*;class Compare 
{
public static void main(String[] args) 
{
int []ia = {1,2,3,4};
int []ib = {1,2,3,4}; if (Arrays.equals(ia, ib)) // 请问为什么将Arrays.equals(ia, ib)改为ia.equals(ib)  编译没错误,但运行结果却什么都没有输出呢? 或者说为什么ia.equals(ib)返回false呢?请诸位指教
{
System.out.println("equals ->  " + "ia == ib");
}
}
}
/*
在JDK 1.6中的运行结果是:
---------------
equals ->  ia == ib
---------------
*/

解决方案 »

  1.   

    2个数组是否相同的算法在哪里? Arrays实现了一个,你是 ia 却没有实现。
      

  2.   

    两个equals的实现方法不一样,第一个是重写了的,第二个是本来的,比较的是引用,不等
      

  3.   

    Arrays.equals是Arrays类的静态方法   正像2#说的  你没有定义equals方法啊
      

  4.   

    这么说吧Arrays.equals比较的是两个数组的值和顺序  如果相同  则返回true
    但是ia.equals(ib)还比较了这两个数组的内存地址  那当然不一样了  所以就返回了false
      

  5.   

    楼上几位的都说了
    Arrays.equals(int[] a, int[] b)里面定义了equals比较的算法
    a.equals(b) 这里调用equals实际上是直接调用到了Object的equals方法。而Object的equals的实现是比较两个对象的引用什么相等,所以这里是返回false.
    如果你要用a.equals(b)也可以,你最好自己定义一个class.例如
    class a{
      private int[] arr;
      a(int[] arr) {
        this.arr = arr;
      }
      public int[] getArr() {
         return arr;
      }
      public boolean equals(Object b) {
         if (b instanceof a) {
           if (b.getArr().length != a.getArr().length) return false;
           for (int i = 0; i < a.getArr().length; ++i) {
              if (!a.getArr()[i].equals(b.getArr()[i])) return false;
           }
           return true;
         }
         return false;
      }
    }
      

  6.   

    两个equals的实现方法不一样,第一个是重写了的Object 类的equals的方法了,第二个是你自己的没有重写equals方法,比较的是引用,查看object类的equals方法和Arrays类的equals方法你就知道了
      

  7.   

    首先Object类是根基类,是所有类的父类,他里面有个equals方法,比较的是对象的引用是否相同,也就是说如果x.equals(y),则当且仅当 x 和 y 引用同一个对象时,该方法才返回 true(x == y 具有值 true)。
    其次这个问题的ia.equals(ib)。 如果想返回true则必须像5楼那样重写equals方法,否则比较的仅仅是父类Object类的equals(默认楼主了解继承了),而父类的equals比较的仅仅是2个引用是否相同,也就是说ia和ib是否指向相同的对象?那2个的new,动态地址分配的肯定不同,引用指向也必然不同。所以返回false.
    Arrays.equals比较的则是被重载过的Arrays类的equals方法,由于是静态的所以可以直接Arrays.equals,这个方法比较的正如4楼所说的。
      

  8.   

    这么说吧Arrays.equals比较的是两个数组的值和顺序  如果相同  则返回true 
    但是ia.equals(ib)还比较了这两个数组的内存地址  那当然不一样了  所以就返回了false