Object类的equals方法和hashCode方法
来源:互联网 发布:动漫周边淘宝 编辑:程序博客网 时间:2024/05/20 09:25
一,equals方法
在Object类中
- public boolean equals(Object obj) {
- return (this == obj);
- }
什么时候应该覆盖equals方法呢?
当我们希望知道它们在逻辑上是否相等,而不是想知道它们是否指向同一个对象时,我们便需要覆盖equals方法了。
覆盖equals方法的通用约定:
1,自反性 对于任何非null的引用值,x.equals(x) == true
2,对称性 对于任何非null的引用值x,y,x.equals(y) == y.equals(x)
3,传递性 对于任何非null的引用值x,y,z,x.equals(y) ==true,y.equals(z)==true,------>x.equals(z)==true
4,一致性 对于任何非null的引用值x,y,只要equals的比较操作在对象中所用的信息没有被改变,多次调用x.equals(y)返回的值不变。
5,对于任何非null的引用值x,x.equals(null)必须返回false。
实现高质量equals方法的注意点:
1,使用==操作符检查 参数是否为这个对象的引用,是则直接返回true。
2,使用instance操作符检查 参数是否为正确的类型。
3,把参数转换成正确的类型。
4,对于该类中的每个关键域,检查参数中的域是否与该对象对应的域匹配。先比较最有可能不一致的域。
5,覆盖equals方法时总要覆盖hashCode方法。
6,不要将equals声明中的Object对象替换为其他对象。
二,hashCode方法
为什么覆盖equals方法时总要覆盖hashCode方法?
因为如果不这么做的话,就违反了Object.hashCode的通用约定,导致该类无法结合所有基于散列的集合(HashMap,HashSet,HashTable)一起正常运作.
通用约定:
1,在应用程序执行期间,只要equals方法的比较操作用到的信息没变,那么对这同一个对象调用多次,hashCode方法都必须始终如一的返回同一个整数.但在应用程序的多次执行中,即重新启动后结果可以不一致.
2,如果两个对象根据equals比较是相等的,那这两个对象调用hashCode方法返回的结果必须是一样的.
3,如果两个对象根据equals比较是不相等,那这两个对象调用hashCode方法返回的结果不一定不同.但不同的对象产生不同的hasCode,可以提高散列表的性能.
不覆盖hashCode而违反的关键约定是第二条:相等的对象必须具有相等的hashCode.
如果相同的对象具有不同的hashCode,那么将对象放入hashMap中,对象会被存到其中一个桶中,但当你去get 时,虽然是同一个对象,但是由于生成的hashCode不同,会到不同的桶中去找,此时便找不到那个对象。
- Object的hashCode方法和equals方法
- 关于Object类的equals方法和hashCode方法
- Object类的equals方法和hashCode方法
- Object的equals和hashCode方法
- Object 类之 hashCode 和 equals 方法
- object类中的equals和hashcode方法
- Object类equals和hashCode方法
- Object类中equals,hashCode和toString方法的学习
- Java源码学习-Object类的hashCode和equals方法
- 覆盖Object类的equals、hashCode和toString方法
- Java中Object类的equals()和hashCode()方法
- 重写object中的hashcode和equals方法
- equals(Object obj)和 hashcode()方法
- java.lang.Object的equals()和hashCode()方法小结
- Java记录 -57- Object的equals、hashcode和toString方法
- Java中重写Object类的equals方法和hashcode方法的注意事项
- Java中重写Object类的equals方法和Hashcode方法的注意事项
- 整理 Object 类(为什么重写 equals 和 hashCode 方法)
- Java:使用MD5加密步骤
- caffe学习笔记10:命令行解析
- Genymotion——启动模拟器提示Unable to start the virtual device,The virtual device got no IP address
- HEVC/H.265与AVC/H.264对比总结
- 行人检测(Pedestrian Detection)资源
- Object类的equals方法和hashCode方法
- Android Studio编写网络相关功能时,无法引入apache.http包解决办法
- 内网穿透 ngrok 服务器和客户端配置
- VMware中安装gcc和升级gdb的方法
- android 关于LCD背光调节渐变过程引起背光闪烁问题
- ubuntu16.04安装pycharm,codelite,bluefish
- 【ASP.NET】 传递数据为空
- nginx 优化(突破十万并发)
- 进程间通信--共享内存