1.==比较双方是否相同,
a.当比较的对象为基础类型时,如果值相等,则返回true,否则为false;
b.当比较的对象为引用类型时,比较的是引用类型的(对象的)地址,如果两个地址相同(即为同一个对象)则返回true,否则为false;
2.equals比较双方是否相同,
a.首先,equals方法在Object基类中已经定义并实现,其比较的是两个对象d的hashcode(指向的地址)是否相同,如果相同则返回ture,否则为false。
b.一般来说,正常的默认继承Object类,则该类的equals功能和Object是一样的,但是由于各种特定意义,Object的equals的比对方式不能够满足比对需求,所以可能需要我们重写equals方法,而java中的String类就重写了Object类的equals方法。
c.String类的equals比对的是,两个字符串内容(value属性)的字符序列是否等,如果相同则返回ture,反之为false。
举一个为什么要重写equals的例子:张三在101班是学生张三,现在,他转到102班之后改名叫张四。作为学生类来说他们是同一个人,我们判断的标准是身份证号【或者是学号(前提学号不变)】。这时候,学生类的equals方法比对时,就不能比对地址了。而是他们的身份证号,这个是唯一不变的。
代码说明:
public static void main(String[] args) {
Object obj1 = new Object();
Object obj2 = new Object();
System.out.println(obj1 == obj2);//false,地址不一样不是同一个对象
System.out.println(obj1.equals(obj2));//false,Object比较的是两个对象的地址
Person2 person = new Person2("张三",11,1);
Person2 person2 = new Person2("小张",11,1);
System.out.println(person == person2);//false,不是同一个对象,但是业务意义上是同一个人,所以需要改写equals
System.out.println(person.equals(person2));//true,id相同,则认为两个人对象内容相同
String s1 = new String("李四");
String s2 = new String("李四");
System.out.println(s1==s2);//false,两个字符串不是同一个对象
System.out.println(s1.equals(s2));//true,两个字符串内容相同,因为String类改写了Object的equals方法,以内容是否相同为最终标准
}
class Person2{
int id;
String name;
int age;
public Person2() {};
public Person2(String name,int age,int id) {
this.age = age;
this.name = name;
this.id = id;
}
public boolean equals(Object obj) {//重写equals方法
if(obj == null) {
return false;
}else{
if(obj instanceof Person2) {
Person2 c = (Person2) obj;
if(c.id == this.id) {
return true;
}
}
}
return false;
}
public String toString() {
return name+",age:"+age;
}
输出结果:
false
false
false
true
false
true