1、== 可以去判断基本数据类型,也可以判断引用类型。
2、== 如果判断基本类型,判断的是值是否相等。
3、如果判断引用数据类型,判断的是地址是否相等,即判断是否是一个对象。
4、只要有基本数据类型,那么判断的就是值是否相等。
1、equals 是Object类中的方法,只能判断能引用类型
2、默认判断地址是否相等,子类中往往重写该方法,用于判断内容是否相等。
怎么理解呢,由于Object是所有类的基类,也就是说一个类无指定的继承对象时候,是默认继承Object类的,所以若子类没有重写equals方法时,是默认比较两个地址是否相等的。
但是一般情况下,我们会重写equals方法,比如String Integer等类,因此这比较的是值(内容)是否相等了。
注:怎么看equals的原码: ctrl + B
重写是对父类的方法进行改进,子类还需要使用改进后的方法。
来重写一个equals方法:(判断连个对象的类容是否相等)
public class Test {
public static void main(String[] args) {
Persion persion0 = new Persion("王明", 24, '男');
Persion persion1 = new Persion("王明", 24, '男');
System.out.println(persion0.equals(persion1));
}
}
class Persion {
//默认继承Objects类,而默认的equals类是比较两个对象的地址的。
private String name;
private int age;
private char gender;
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj instanceof Persion) {
//向下转型,因为我想得到子类的私有属性,私有方法一样要向下转型啊。
Persion p = (Persion)obj;
return this.age == p.age && this.gender == p.gender && (this.name).equals(p.name);
}
return false;
}
public Persion(String name, int age, char gender) {
this.name = name;
this.age = age;
this.gender = gender;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public char getGender() {
return gender;
}
public void setGender(char gender) {
this.gender = gender;
}
}
字符串在调用equals 的时候,首先要看下是否所示字符串,如果不是的话,就直接返回false。最后的属性值 也不用再比较了。
String的equals 源码在这里
sb 是没有equals 方法的。
默认使用的是顶级父类的equals 方法,比较的是地址值。
s是在串池中,sb 是在堆中,怎么能是一个地址呢?