黑马程序员技术交流社区

标题: ==和equals()的区别? [打印本页]

作者: cuijinghao    时间: 2015-9-29 23:53
标题: ==和equals()的区别?
  ==:
   可以比较基本类型,也可以比较引用类型。
   比较基本类型,比较的是值是否相同。
   比较引用类型,比较的是地址值是否相同。
  equals:
   只能比较引用类型。
   默认情况下,比较的是地址值是否相同。
   如果想比较内容,请自己重写Object类的equals()方法。


作者: iverchen    时间: 2015-10-1 12:51
通知分析得很好,我也是在这里很糊涂,回头我还要看看你的最后一句“如果想比较内容,请自己重写Object类的equals()方法“。这句话我还没搞清楚
作者: yiranpanda    时间: 2015-10-1 14:10
进来学习一下~
作者: meijunwei6275    时间: 2015-10-1 14:23
学习一下                                          
作者: 15001162522    时间: 2015-10-1 15:23
总结得很好~~~
作者: kebingxing    时间: 2015-10-1 20:39
没说清楚,最好举个例子
作者: yuzhouyichen    时间: 2015-10-1 21:04
我来举个例子吧,下面是一个标准的学生类,equals方法是重写的,如果不重写此方法,则调用此方法为默认继承的Object的equals方法,比较的是对象的地址值是否相同,我们知道不同的对象肯定有不同的地址值,所以此方法不重写一般没什么用。  下面例子重写后比较的是学生类中 的名字和年龄属性是否相同。
  1. public class Student {
  2.         private String name;
  3.         private int age;
  4.         public Student() {
  5.                 super();
  6.         }
  7.         public Student(String name, int age) {
  8.                 super();
  9.                 this.name = name;
  10.                 this.age = age;
  11.         }
  12.         public String getName() {
  13.                 return name;
  14.         }
  15.         public void setName(String name) {
  16.                 this.name = name;
  17.         }
  18.         public int getAge() {
  19.                 return age;
  20.         }
  21.         public void setAge(int age) {
  22.                 this.age = age;
  23.         }
  24.         @Override
  25.         public String toString() {
  26.                 return "Student [name=" + name + ", age=" + age + "]";
  27.         }

  28.         @Override
  29.         public boolean equals(Object obj) {
  30.                 if (this == obj)
  31.                         return true;
  32.                 if (obj == null)
  33.                         return false;
  34.                 if (getClass() != obj.getClass())
  35.                         return false;
  36.                 Student other = (Student) obj;
  37.                 if (age != other.age)
  38.                         return false;
  39.                 if (name == null) {
  40.                         if (other.name != null)
  41.                                 return false;
  42.                 } else if (!name.equals(other.name))
  43.                         return false;
  44.                 return true;
  45.         }
  46.        
  47. }
复制代码

作者: cuijinghao    时间: 2015-10-1 21:15
kebingxing 发表于 2015-10-1 20:39
没说清楚,最好举个例子

比较基本数据类型
2==3;
比较引用数据类型
Person p=new Person(“张三”,12);
Person p2=new Person(“张三”,12);
p==p2;false
equals比较引用数据类型
p.equals(p2);false
重写之后
p.equals(p2);true

作者: 碧血丹心    时间: 2015-10-1 21:16
string类就是重写的
作者: cuijinghao    时间: 2015-10-1 21:23
iverchen 发表于 2015-10-1 12:51
通知分析得很好,我也是在这里很糊涂,回头我还要看看你的最后一句“如果想比较内容,请自己重写Object类的 ...

比如新建了一个Person类属性有name和age,新建了两个Person对象p1,p2;
如果相比较p1和p2 的name和age是否相同,就要去Person类中重写equals()方法;
@Override
        public boolean equals(Object obj) {
                if (this == obj)
                        return true;
                if (obj == null)
                        return false;
                if (getClass() != obj.getClass())
                        return false;
                Person other = (Person) obj;
                if (age != other.age)
                        return false;
                if (name == null) {
                        if (other.name != null)
                                return false;
                } else if (!name.equals(other.name))
                        return false;
                return true;
        }




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