- 一.equals
- 二. hashCode
一.equals
Object是Java默认提供的⼀个类。Java⾥⾯除了Object类,所有的类都是存在继承关系的。默认会继承Object⽗类。即所有类的对象都可以使⽤Object的引⽤进⾏接收。
1.equals 默认代码
不重写的情况下继承的是父类的比较方法。
比如: 这时候对比的是内部地址
publicbooleanequals(Objectobj){return(this==obj);}这时候就需要去重写equals方法
比如:现在比较name和age
importjava.util.Objects;publicclassequals{staticclassStudent{//两个比较对象publicStringname;publicintage;//结构方法publicStudent(intage,Stringname){this.age=age;this.name=name;}//这里根据实际情况重写equals@Overridepublicbooleanequals(Objecto){//这里是防止空指针,和类型不同if(o==null||getClass()!=o.getClass())returnfalse;//因为用的是Object接收所以需要强制类型转换Studentstudent=(Student)o;returnage==student.age&&Objects.equals(name,student.name);}}publicstaticvoidmain(String[]args){Studentstudent1=newStudent(5,"lisi");Studentstudent2=newStudent(5,"lisi");//比较System.out.println(student1.equals(student2));}}大部分实际情况都是需要重写的equals
equals 五大特性
- 自反性:
x.equals(x)→ true - 对称性:x.equals(y) = y.equals(x)
- 传递性:x.equals (y)=true,y.equals (z)=true,则 x.equals (z)=true
- 一致性:只要对象属性不变,多次调用 equals 返回结果不变
- 非空性:
x.equals(null)一定返回 false
二. hashCode
## 2.1 hashCode 没重写前也是继承的Object的原生代码:
publicnativeinthashCode();native本地方法,JVM 底层实现。- 默认返回:对象在堆内存的哈希值(不是内存地址,但和地址相关)。
2.2 相等的对象哈希码一定相同;哈希码相同对象不一定相等。
如果两个对象equals() == true,它们的 hashCode 必须相等。
重写 equals,就必须重写 hashCode。
2.3重写hashCode的写法
@OverridepublicinthashCode(){returnObjects.hash(name,age);}