A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

class Demo
{       
        private int[] arr;
        Demo(int[] arr)//把数组 作为类的成员。通过比较对象是否相同,来确定这个类中的数组是否相同
        {
                this.arr=arr;
       
        }
       
        public boolean equals(Object obj)//对object类进行复写。
        {                                
               
                Demo d=(Demo)obj;
                return this.arr==d.arr;
       
        }

       
}
class ArrEquals
{
        public static void main(String[] args)
        {        int arr1[]={1,2,3};
                int arr2[]={1,2,3};
               
                 Demo p1=new Demo(arr1);
                 Demo p2=new Demo(arr2);
               
               
                System.out.println(p1.equals(p2));
       
       
        }

                           为什么结果是false啊  应该是true才对啊  不知道哪错了 求大神指点啊
}

评分

参与人数 1技术分 +2 收起 理由
Doraemon + 2

查看全部评分

25 个回复

倒序浏览
你覆写的equals方法,比较的还是数组地址是否相同,而不是数组元素是否相等。Java中,数组,哪怕是元素为基本类型的数组,也是对象。记得:int[] a = new a[3]; 这种写法么?这就体现了数组的本质:用new运算符创建出来的必然是引用类型。你用大括号初始化,不过是语法上的一种简写,本质依然是new。因此,数组变量a是引用类型变量。你在equals里直接用==比较引用类型,依然是地址比较,当然是false

评分

参与人数 1技术分 +2 收起 理由
Doraemon + 2

查看全部评分

回复 使用道具 举报
fantacyleo 发表于 2014-7-16 21:26
你覆写的equals方法,比较的还是数组地址是否相同,而不是数组元素是否相等。Java中,数组,哪怕是元素为基 ...

也就是不能把数组看成对象中的成员。 数组只能看作是对象。
回复 使用道具 举报
待解封的小刀 发表于 2014-7-16 22:19
也就是不能把数组看成对象中的成员。 数组只能看作是对象。

这两者没有关联。你的代码中,数组当然是对象成员,但它本身也是对象,arr是引用类型变量。如果你在类中定义一个int,也是对象成员,可是int不是引用类型,所以拿==比较没有问题,符合你的要求。但是拿==去比较引用类型,就成了比较地址
回复 使用道具 举报
fantacyleo 发表于 2014-7-16 22:25
这两者没有关联。你的代码中,数组当然是对象成员,但它本身也是对象,arr是引用类型变量。如果你在类中 ...

那怎么做  我的思想没错啊 这个用equals 怎么比较呢? 是不是equals只能比较基本类型?比较引用的就变成地址了吗?
回复 使用道具 举报
待解封的小刀 发表于 2014-7-16 22:38
那怎么做  我的思想没错啊 这个用equals 怎么比较呢? 是不是equals只能比较基本类型?比较引用的就变成 ...

1. for循环下标,逐个元素比较是否相等。
2. 用Arrays工具类中的equals方法比较数组对应元素是否相等。
回复 使用道具 举报
icris 中级黑马 2014-7-16 22:51:10
7#
查到一个数组比较方法
return Arrays.equals(this.arr, d.arr);

回复 使用道具 举报
icris 发表于 2014-7-16 22:51
查到一个数组比较方法
return Arrays.equals(this.arr, d.arr);

我有一点不明白 这equals 本来是比较对象是否相同的 也就是地址;但是我已经覆盖了这个功能啊 怎么变不了比较内容呢?
像我比较人的年龄是否相同就可以啊。
class Person

      private int age;
      Person(int age)
     {   
          this.age=age;
      }
     public boolean equals(object obj)
      {  Person d=(Person)obj;
         return this.age==d.age;
      }
class PersonDemo
{     
      public static void main(String[] args)
     {   
       Person.d1=new Person(7);
       Person.d2=new Person(7);
      System.out.println(d1.equals(d2));
      }
}  这比较的是年龄啊 有点晕了 。。。。。这个比较的不是地址值啊。



回复 使用道具 举报
icris 中级黑马 2014-7-16 23:23:21
9#
待解封的小刀 发表于 2014-7-16 23:05
我有一点不明白 这equals 本来是比较对象是否相同的 也就是地址;但是我已经覆盖了这个功能啊 怎么变不了 ...

你重写了自己的 Demo 里的 equals ,但是返回值是两个数组的 == 运算,数组比较相等是不能用 == 的,而且数组也没有重写 equals ,用 this.arr.equals(d.arr) 效果和 == 一样,都不能得到正确结果,把 equals 的返回值改成
return Arrays.equals(this.arr, d.arr);
应该就行了。
就是说,你重写了 Demo 的 equals 只能保证返回的不是两个 Demo 对象地址比较,但是返回了两个数组的地址比较,仍然不是正确的结果
回复 使用道具 举报
icris 发表于 2014-7-16 23:23
你重写了自己的 Demo 里的 equals ,但是返回值是两个数组的 == 运算,数组比较相等是不能用 == 的,而且 ...

哦  我明白了 也就是return this.arr==b.arr 返回的还是地址值的比较是否正确。
大神 我把return改成arrays的形式 还是不行  因为我的Demo中没Arrays啊  怎么在前面加上。
回复 使用道具 举报
icris 中级黑马 2014-7-17 08:10:07
11#
待解封的小刀 发表于 2014-7-17 07:56
哦  我明白了 也就是return this.arr==b.arr 返回的还是地址值的比较是否正确。
大神 我把return改成arra ...
  1.         public boolean equals(Object obj){                                
  2.                 Demo d=(Demo)obj;
  3.                 return Arrays.equals(this.arr, d.arr);
  4.         }
复制代码

Arrays.equals 是静态方法可以直接用,A 大写,我试了一下结果是 true
回复 使用道具 举报
同楼上!!!!!
回复 使用道具 举报
icris 发表于 2014-7-17 08:10
Arrays.equals 是静态方法可以直接用,A 大写,我试了一下结果是 true

class Demo
{       
        private int[] arr;
        Demo(int[] arr)
        {
                this.arr=arr;
       
        }
       
        public boolean equals(Object obj)
        {                              
               
                Demo d=(Demo)obj;
                return Arrays.equals(this.arr,d.arr);
       
        }

       
}
class ArrEquals
{
        public static void main(String[] args)
        {        int arr1[]={1,2,3};
                int arr2[]={1,2,3};
               
                 Demo p1=new Demo(arr1);
                 Demo p2=new Demo(arr2);
               
               
                System.out.println(p1.equals(p2));
       
       
        }


}
回复 使用道具 举报
icris 发表于 2014-7-17 08:10
Arrays.equals 是静态方法可以直接用,A 大写,我试了一下结果是 true

class Demo
{       
        private int[] arr;
        Demo(int[] arr)
        {
                this.arr=arr;
       
        }
       
        public boolean equals(Object obj)
        {                              
               
                Demo d=(Demo)obj;
                return Arrays.equals(this.arr,d.arr);
       
        }

       
}
class ArrEquals
{
        public static void main(String[] args)
        {        int arr1[]={1,2,3};
                int arr2[]={1,2,3};
               
                 Demo p1=new Demo(arr1);
                 Demo p2=new Demo(arr2);
               
               
                System.out.println(p1.equals(p2));
       
       
        }

      我这样写的  但是显示Arrays在类中找不到
}
回复 使用道具 举报
icris 中级黑马 2014-7-17 08:58:50
15#
待解封的小刀 发表于 2014-7-17 08:45
class Demo
{       
        private int[] arr;
  1.     /**
  2.      * Returns <tt>true</tt> if the two specified arrays of ints are
  3.      * <i>equal</i> to one another.  Two arrays are considered equal if both
  4.      * arrays contain the same number of elements, and all corresponding pairs
  5.      * of elements in the two arrays are equal.  In other words, two arrays
  6.      * are equal if they contain the same elements in the same order.  Also,
  7.      * two array references are considered equal if both are <tt>null</tt>.<p>
  8.      *
  9.      * @param a one array to be tested for equality
  10.      * @param a2 the other array to be tested for equality
  11.      * @return <tt>true</tt> if the two arrays are equal
  12.      */
  13.     public static boolean equals(int[] a, int[] a2) {
  14.         if (a==a2)
  15.             return true;
  16.         if (a==null || a2==null)
  17.             return false;

  18.         int length = a.length;
  19.         if (a2.length != length)
  20.             return false;

  21.         for (int i=0; i<length; i++)
  22.             if (a[i] != a2[i])
  23.                 return false;

  24.         return true;
  25.     }
复制代码

从源码复制的,真的不能用就复制一下吧…
回复 使用道具 举报
icris 中级黑马 2014-7-17 09:02:43
16#
待解封的小刀 发表于 2014-7-17 08:45
class Demo
{       
        private int[] arr;

想起来了,在最上面加上

import java.util.Arrays;
回复 使用道具 举报
icris 发表于 2014-7-17 09:02
想起来了,在最上面加上

import java.util.Arrays;

这个是什么意思  有什么作用啊 ?
回复 使用道具 举报
icris 发表于 2014-7-17 08:58
从源码复制的,真的不能用就复制一下吧…

这个比较 不错
回复 使用道具 举报
比较的是两个对象,两地址值。年纪是具体指,比较的是值
回复 使用道具 举报
人心如水 发表于 2014-7-17 09:22
比较的是两个对象,两地址值。年纪是具体指,比较的是值

什么情况 可否解释清楚?年龄这里  我把equals复写了 所以比较的是age的值  不是地址值了啊
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马