equals和==
equals和==
准则:
基本类型判断是否相等用==方法,引用类型判断是否相等用equals方法
object类的equals方法底层代码是通过==实现的,所以我们在编写类的时候需要重写equals。
``
public static boolean equals(Object a, Object b) {
return (a == b) || (a != null && a.equals(b));
}
分析:这已经是改进过的了,原始版本为return a == b;
改进之后:首先判断a==b,如果不可以,再判断equals,只有当两者都不通过时,再判断a和b。
重写的equals如下:
public class Student1 {
int id;
String grade;
public Student1() {
}
public Student1(int id, String grade) {
this.id = id;
this.grade = grade;
}
public int getId() {
return id;
}
public String getGrade() {
return grade;
}
public void setId(int id) {
this.id = id;
}
public void setGrade(String grade) {
this.grade = grade;
}
@Override
public String toString() {
return "Student1{" +
"id=" + id +
", grade='" + grade + '\'' +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student1 student1 = (Student1) o;
return id == student1.id && Objects.equals(grade, student1.grade);
//这里进行引用类型用equals来进行判断
}
}
结果分析:
因为类中的equals方法会调用属性类的equals方法,所以我们在创建类的时候尽量要重写equals方法。
总结:
- 基本类型判断是否相等用==方法,引用类型判断是否相等用equals方法
- object类的equals方法底层代码是通过==实现的,所以我们在编写类的时候需要重写equals。
- 因为类中的equals方法会调用属性类的equals方法,所以我们在创建类的时候尽量要重写equals方法。
- 位于基本类型(包装类)常量池中的,能够直接用==进行比较。
- 还要注意字符串常量池
但是!!!类重写equals必须要重写hashCode()方法!!
长话短说,就是为了避免在需要hash值的hashmap、hashset、hashtable、currenthashmap等中,能够对相同内容的对象去重。
hash值不会影响==的判断, ==判断的是引用类型的内存地址不是hash值。这是我之前疑惑的一个点。