黑马程序员技术交流社区

标题: 如何判断两个对象是否相等 [打印本页]

作者: 黎健东    时间: 2012-7-24 21:23
标题: 如何判断两个对象是否相等
  1. public class Test2 {
  2. public static void main(String[] args) {
  3. Person p1 = new Person(10);
  4. Person p2 = new Person(10);


  5. }

  6. class Person{
  7.      int age;
  8.      Person(int age){
  9.      this.age = age;
  10.      }
  11. }

  12. }
复制代码
如何添加某种条件与判断,使得他们的判断结果为true,但是更改了某个条件后,他们的判断结果为false
说明原因,为什么
作者: 孙建飞    时间: 2012-7-24 21:48
01.public class Test2 {

02.public static void main(String[] args) {

03.Person p1 = new Person(10);

04.Person p2 = new Person(10);

05.//在这里添加代码

06.System.out.println(p1.equals(p2));    //结果打印true   equals()方法比较是两个对象的实际内容是否相等,如果相等返回true,不等返回false

07..System.out.println(p1==p2);           //结果打印false   ==比较的是操作数的值之间的关系,这里比较的是对象的引用是否相等。如果相等返回true,不等返回false



08.}


作者: 杜佳瑞    时间: 2012-7-24 22:12
本帖最后由 杜佳瑞 于 2012-7-24 23:37 编辑

public class Test2
{
      public static void main(String[] args)
      {
           Person p1 = new Person(10);
           Person p2 = new Person(10);
           System.out.println(p1.age==p2.age);// 结果是true,如果(p1=p2)结果是false,因为p1和p2是两个对象的地址,
                                                                     不可能相等,而p1.age和p2.age是不同地址上得数据,都是10.

}
class Person
{        
          int age;
          Person(int age)
         {
              this.age = age;
         }
}


作者: 李菁    时间: 2012-7-24 22:17
public class Test2 {
        public static void main(String[] args) {
                bbb b1=new bbb(10);
                bbb b2=new bbb(10);
                b1=b2;   把b2的值赋给b1,比较结果为true。如果不赋值,则为false
                System.out.println(b1.equals(b2));
        }
}
作者: 蔡建荣    时间: 2012-7-24 22:19
孙建飞 发表于 2012-7-24 21:48
01.public class Test2 {

02.public static void main(String[] args) {

赞! 这个想法比较吊
作者: 刘海源    时间: 2012-7-24 22:23
class  ArrayDemo
{
public static void main(String[] args)
{
   Person p1 = new Person(10);
   Person p2 = new Person(10);
   System.out.println(p1.equals(p2));
   //这里重写了equals方法,两个对象比较的是元素的值是否相等,所以为true
   System.out.println(p1==p2);
   //这里比较的是两个对象的地址值,因为都是new的对象,所以分配的空间不一样,自然地址值就不一样了,就是false
}
}
class Person {
int age;
Person(int age) {
  this.age = age;
}
public int getAge()
{
  return age;
}
public boolean equals(Object obj)
{
  Person p=(Person)obj;
  return this.age == p.age;
}
}

作者: 刘海源    时间: 2012-7-24 22:25
打印结果:

V@0[1D$8L5EJO[][G4XAC8S.jpg (2.22 KB, 下载次数: 67)

V@0[1D$8L5EJO[][G4XAC8S.jpg

作者: 郑正华    时间: 2012-7-24 23:15
楼主的代码有误呀!Person类不能放在Test2类中,因为Test2类里面是要实例化Person类的。这个基本常识我不讲了啊,楼主想了解如何判断两个对象是否相等,是不是想了解“==”和equals的用法呢?把你的代码稍微修改下。
class Person {
      int age;
      Person(int age) {
            this.age = age;
      }
}
public class Demo3 {
     public static void main(String[] args) {
                Person p1 = new Person(10);
                Person p2 = new Person(10);
                p1 = p2;  
                 System.out.println(p1==p2);
                 System.out.println(p1.equals(p2));
    }
}
上面的代码执行结果是:
true
true
----------------------------
对于非字符串变量来说,"=="和"equals"方法的作用是相同的,都是用来比较其对象在堆内存的首地址,即用来比较两个引用变量是否指向同一个对象。在这里因为p1=p2语句,p1的引用指向了p2,所以两个引用变量指向了同一个对象,所以就都是true了!
如果删除了语句:p1 = p2;代码执行结果是:
false
false
------------------------------
因为p1和p2分别实例化,开辟了两个不同的空间,其首地址也不一样,指向当然也就不一样,所以结果就都是false了。




作者: 王志明    时间: 2012-7-24 23:20
1.用==判断的是两个引用变量的值是否相等,应用变量只是对对象的引用
2.要想判断两个对象的内容是否相等,需要重写hashCode和equals方法


作者: 朱云坤    时间: 2012-7-25 04:47
  1. public class Test2 {
  2. public static void main(String[] args) {
  3. Person p1 = new Person(10);
  4. Person p2 = new Person(10);
  5. System.out.println(p1.equals(p2));//false   比较的是内容  内容相同时  为true
  6. System.out.println(p1==p2);//false   比较的是地址  当其存放的地址相同时  即为true;
  7. p1=p2;
  8. System.out.println(p1.equals(p2));//true
  9. System.out.println(p1==p2);//true

  10. }
  11. class Person{
  12. private int age;
  13. Person(int age){
  14. this.age = age;
  15. }
  16. }//原代码有些小问题哦  已改正
复制代码

图片1.png (151.78 KB, 下载次数: 64)

图片1.png

作者: 朱云坤    时间: 2012-7-25 04:54
朱云坤 发表于 2012-7-25 04:47

上面贴错图了 {:soso_e133:}

1.png (1.05 MB, 下载次数: 71)

1.png

作者: 罗宵    时间: 2012-7-25 23:00
03.Person p1 = new Person(10);

04.Person p2 = new Person(10);
这个new了p1和p2两个对象,所以地址值不同,则p1==p2的结果是false;
equals()方法,所有类都继承这个方法,所以在没有从写的情况下也是比较对象的地址值。一般情况下可以重写,以判断两对象的内容是否相等。若重写了;
则:p1.equal(p2)的结果是true;




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2