equals和HashCode 修改一致?
来源:互联网 发布:在线注音软件 编辑:程序博客网 时间:2024/06/05 03:18
1.Object类的public boolean equals(Object obj)方法是通过 return this == obj;这种方式比较两个对象是否相同。这里比较的是引用。
2.Object类的public int hashCode()方法,是通过该实例地址转换为int值。所以不同的Object实例在同一运行期hashCode一定不相同。
以上两点是针对Object类本身说的,但是不同的子类会重写这两个方法,满足他们各自的比较特性,比如众所周知的String中equals()方法就是比较内容,而不是比较this == obj。相同的,String对象的hashCode也不是内存地址的反应,而是通过对String的value计算得到一个int值来做hashCode()结果。
所以每个类都可以分别将equals和hashCode两个方法重写。但是一般都是一起重写,使其基于同样的比较方法,就像上面String那样。这是出于一种协定,因为很多情况下,从提高效率角度出发,比较两个对象时候,hashCode会优先于equals方法,这个可以看JDK源代码中HashMap的put(K,V)方法。源码中,首先比较K的hashCode然后再比较equals。说明JDK协定:如果hashCode不相同,那么两个对象一定不相同;如果hashCode相同,那么两个对象还得通过equals来比较(另外hibernate里面好像也有类似的机制来比较Entity Bean,但是说实话我不太了解详细情况,这里不敢多讲哈)。我想,这恐怕就是指导大家每次同时重写两个方法的原则吧。
最后多余一句,昨天被花旗面试就问到这个问题,问是不是重写了equals,就一定要再重写hashCode,我怎么回答,现在都不知道。为什么每次都在电话里面被这样的问题闷住 - -||||
2.Object类的public int hashCode()方法,是通过该实例地址转换为int值。所以不同的Object实例在同一运行期hashCode一定不相同。
以上两点是针对Object类本身说的,但是不同的子类会重写这两个方法,满足他们各自的比较特性,比如众所周知的String中equals()方法就是比较内容,而不是比较this == obj。相同的,String对象的hashCode也不是内存地址的反应,而是通过对String的value计算得到一个int值来做hashCode()结果。
所以每个类都可以分别将equals和hashCode两个方法重写。但是一般都是一起重写,使其基于同样的比较方法,就像上面String那样。这是出于一种协定,因为很多情况下,从提高效率角度出发,比较两个对象时候,hashCode会优先于equals方法,这个可以看JDK源代码中HashMap的put(K,V)方法。源码中,首先比较K的hashCode然后再比较equals。说明JDK协定:如果hashCode不相同,那么两个对象一定不相同;如果hashCode相同,那么两个对象还得通过equals来比较(另外hibernate里面好像也有类似的机制来比较Entity Bean,但是说实话我不太了解详细情况,这里不敢多讲哈)。我想,这恐怕就是指导大家每次同时重写两个方法的原则吧。
最后多余一句,昨天被花旗面试就问到这个问题,问是不是重写了equals,就一定要再重写hashCode,我怎么回答,现在都不知道。为什么每次都在电话里面被这样的问题闷住 - -||||
0 0
- equals和HashCode 修改一致?
- equals() 和 hashCode()
- hashcode()和equals()方法
- hashcode() 和 equals()方法
- 关于equals和hashCode
- 重写equals()和hashCode()
- 关于hashcode()和equals()
- hashcode和equals
- equals和hashCode
- equals 和 hashcode
- 关于equals() 和hashcode()
- 关于equals() 和hashcode()
- equals()和hashCode()
- equals() 和hashcode()详解
- hashCode()和equals()
- equals和 hashcode比较
- 浅谈equals和hashcode
- equals和hashCode方法
- 驱动SG90舵机运算
- Java如何跳出多层循环 采用标签
- 销量统计
- 第十四周:C语言:输入一个数插入有序数组中
- 第三章 高质量的代码 数值的整数次方
- equals和HashCode 修改一致?
- php清除html标签,除空格和换行
- shell的一些基本命令(使用的小技巧)
- Ubuntu 16.04(32位)下iTop4412环境搭建+Android4.0.3编译
- 缓存在高并发场景下的常见问题
- 玩玩Linux云主机-连接到远程的服务器上
- 启动 Eclipse 弹出“Failed to load the JNI shared library jvm.dll”
- 反射专题5
- EL表达式中如何截取字符串