- ==:该操作符生成的是一个
boolean
类型的结构,用于计算两个操作数值的关系 - equals:Object 的 实例方法,比较两个对象的内存地址是否相同
- hashCode:Object 的 native方法,获取对象的哈希值,用于确定该对象在哈希表中的索引位置,它实际上是一个int型整数
区别
==:
- 比较
基本数据类型
时,比较的是值
本身- 比较引用数据类型时,比较的是与引用指向的对象的内存地址
equals:
- 在没有被重写的情况下,比较的是两个对象的内存地址
- 当被String类重写时,比较的时两个字符串的内容
hashCode和equals:
- 如果两个对象相同,即
equals
返回true
,那么这两个对象的hashCode
值一定要相同- 如果两个对象的
hashCode
值相同,equals
方法不一定返回true
- 这样做是为了提高比较的效率,当两个对象的
hashCode
值相同是,不再需要进行equals
比较,这样大大减少了equals
的比较次数,在比较数据很大时,效率明显提升。HashSet
就是一个较好的例子,HashSet
是无序不重复集合,Java采用了哈希表
,使用散列算法
,将对象数据根据该对象的特征使用特定的算法将其定义到一个地址上,那么在后面定义进来的数据,只要看对应的hashcode地址上是否有值,那么就用equals比较,如果没有则直接插入,只要就大大减少了equals的使用次数,执行效率大大提升
为什么必须要重写hashcode方法
为了保证同一个对象,保证在equals相同的情况下hashcode值必定相同,如果重写了equals而未重写 hashcode方法,可能就会出现两个没有关系的对象equals相同的(因为equal都是根据对象的特征进行重写的),但hashcode确实不相同的。