1.==是一个运算符,equals是一个方法
2.==比较基本数据类型比较的是值的大小,比较引用数据类型比较的是地址值是否相同。
3.equals方法比较的是引用数据类型。如果未重写比较的也是地址值。重写后比较的是内容
String name; public Person() { } public Person(String name) { this.name = name; } public static void main(String[] args) { Person p1 = new Person("aa"); Person p2 = new Person("aa"); System.out.println(p1);//demo1211.Person@50cbc42f System.out.println(p2);//demo1211.Person@75412c2f System.out.println(p1.equals(p2));// }
注意:这里虽然两个对象的内容相同,但是在源码中依然是用==进行判断,比较地址值。所以比较结果为false。且各位学习的小伙伴记住,只要new对象,必定在堆内存开辟空间,所以两个对象地址肯定是不一样的。
4.通常使用equals方法比较地址值无任何意义,比如按照上述案例,创建了p1,p2两个对象,其中name属性都是相同,我们认为name相同的人就应该是相等的。所以需要重写equlas方法。
重写equals方法的注意事项:
这里有以下两种重写的方式:书中给出的解释如下。
1.如果子类有自己的相等性概念,则对称性需求将强制使用getclass方法进行检测。
2.如果由超类决定相等性概念,那么就可以使用instanceof关键字检测,这样就可以在不同的子类对象之间进行相等性比较。
第一种:
public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Person person = (Person) o; return Objects.equals(name, person.name); }
第二种:
public boolean equals(Object o) { if (this == o) return true; if (!(o instanceof Person)) return false; Person person = (Person) o; return Objects.equals(name, person.name); }
ps:先写到这里,第一次写,疏漏会很多,有不妥和疑问的地方欢迎大家指正和询问。