- 浏览: 73842 次
- 性别:
- 来自: 北京
最新评论
-
TopLongMan:
...
weblogic与websphere的区别———转 -
wendellup_account1:
thanks.
tomcat 只输ip或localhost就可以直接访问项目的步骤 -
kittychina:
不要把程序员的低薪归结为程序员自己不努力!虽然我们都提倡要努力 ...
程序员前途
一. 关键字:
Object 、 equals() 、 hashCode ()
二. 为什么需要重写:
众所周知, Object 是所有类的父类。但,我们在实际开发中自定义自己类时,往往需要重写 Object 中 equals 和 hashCode 方法。为什么呢?首先看看 Object 的 API 吧。
Object 类中原始写法是:
public boolean equals ( Object obj ) {
return ( this == obj ) ;
}
可见,原始 equals 比较的是 2 个对象的“内存地址”。但,我们往往是需要判断的是“逻辑上的内容”是否相等,如: String 、 Integer 、 Math... 等等,时而我们关心是逻辑内容上是否相等,而不关心是否指向同一对象,所以所要重写。
再者,尽管 Object 是一个具体的类,但是设计它主要是为了扩展。它所要的非 final 方法( equals hashCode toString clone 和 finalize )都有通用约定( general contract ),因为它们被设计成要被覆盖( override )的。任何一个类,它在覆盖这些方法的时候,都有责任遵守这些通用的约定;如果不能做到这一点,其它依赖这些约定的类(例如 HashMap 和 HashSet )就无法结合该类一起正常运行。
JDK API 上重写 equals 约定如下:
自反性 :
对于任何非空引用值 x ,x.equals(x) 都应返回 true 。
对称性 :
对于任何非空引用值 x 和 y ,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应返回 true 。
传递性 :
对于任何非空引用值 x 、y 和 z ,如果 x.equals(y) 返回 true ,并且 y.equals(z) 返回 true ,那么 x.equals(z) 应返回 true 。
一致性 :
对于任何非空引用值 x 和 y ,多次调用 x.equals(y) 始终返回 true 或始终返回 false ,前提是对象上 equals 比较中所用的信息没有被修改。
对于任何非空引用值 x ,x.equals(null) 都应返回 false
同时, API 规定“ 当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码 “所以也要重写 hashCode 方法。
public native int hashCode () ;
说明是一个本地方法,它的实现是根据本地机器相关的,方法返回的是对象的地址值。时而重写 hashCode 一是为了遵守 API 约定,二是重点提高对象比较时效率。
因为,在 java 集合对象中比较对象是这样的,如 HashSet 中是不可以放入重复对象的,那么在 HashSet 中又是怎样判定元素是否重复的呢?让我们看看源代码(首先要知道 HashSet 内部实际是通过 HashMap 封装的):
public boolean add ( Object o ) { //HashSet 的 add 方法
return map.put ( o, PRESENT ) == null ;
}
public Object put ( Object key, Object value ) { //HashMap 的 put 方法
Object k = maskNull ( key ) ;
int hash = hash ( k ) ;
int i = indexFor ( hash , table.length ) ;
for ( Entry e = table [ i ] ; e != null ; e = e.next ) {
if ( e.hash == hash && eq ( k, e.key )) { // 从这里可见先比较 hashcode
Object oldValue = e.value;
e.value = value;
e.recordAccess ( this ) ;
return oldValue;
}
}
modCount++;
addEntry ( hash , k, value, i ) ;
return null ;
}
所以在 java 的集合中,判断两个对象是否相等的规则是:
1 ,判断两个对象的 hashCode 是否相等
如果不相等,认为两个对象也不相等,完毕
如果相等,转入 2
2 ,判断两个对象用 equals 运算是否相等
如果不相等,认为两个对象也不相等
如果相等,认为两个对象相等
为什么是两条准则,难道用第一条不行吗?不行,因为 hashCode() 相等时, equals() 方法也可能不等 ,所以必须用第 2 条准则进行限制,才能保证加入的为非重复元素。
三. 例子:
1. 首先
class Student {
String name ;
int age ;
Student ( String name , int age ){
this . name =name ;
this . age =age ;
}
// 没有重写 equals 和 hashCode
}
/**
* @author ydj
* @version Apr 28, 2010 3:12:42 PM
*/
public class OverEqualsHashcodeTest {
public static void main ( String [] args ){
Set < Student > set= new HashSet < Student > () ;
Student stu1= new Student ( "ydj" ,26 ) ;
Student stu2= new Student ( "ydj" ,26 ) ;
set.add ( stu1 ) ;
set.add ( stu2 ) ;
System .out . println ( "set.size():" +set.size ()) ;
}
}
结果是: 2. (这个无须解释)
2. 现在重写 equals 方法如下:
public boolean equals ( Object obj ){
System .out . println ( "--------equals()-----------:" +obj ) ;
if ( obj == null ){
return false ;
}
if ( ! ( obj instanceof Student )){
return false ;
} else {
Student oth= ( Student ) obj ;
return this . age ==oth. age && this . name ==oth. name ;
}
// return true;
}
结果是: 2. (为什么依然是 2 呢?!为什么连 equals 方法都没调用呢)
分析: 这就是为什么要重写 hashCode 的原因( 相等对象必须具有相等的哈希码 )。因为现在的 hashCode 依然返回各自对象的地址,就是说明此时的 hashCode 肯定不相等,故根本不会调用 equals ()。
3. 重写 hashCode 方法如下:
public int hashCode (){
int res=17;
res=31*res+ age ;
res=31*res+ name . hashCode () ;
return res;
}
结果是: 1.
如果这样重写 hashCode :
public int hashCode (){
int res= ( int )( Math.random () *100 ) ;
return res;
}
这样的话,就等于没有重写了。
四. 设计 equals ()和 hashCode ():
A .设计equals()
[1] 使用instanceof 操作符检查“实参是否为正确的类型”。
[2] 对于类中的每一个“关键域”,检查实参中的域与当前对象中对应的域值。
[2.1] 对于非float 和double 类型的原语类型域,使用== 比较;
[2.2] 对于对象引用域,递归调用equals 方法;
[2.3] 对于float 域,使用 Float.floatToIntBits ( afloat ) 转换为int ,再使用== 比较;
[2.4] 对于double 域,使用 Double.doubleToLongBits ( adouble ) 转换为int ,再使用== 比较;
[2.5] 对于数组域,调用Arrays.equals 方法。
B. 设计hashCode()
[1] 把某个非零常数值,例如17 ,保存在int 变量result 中;
[2] 对于对象中每一个关键域f (指equals 方法中考虑的每一个域):
[2.1]boolean 型,计算(f ? 0 : 1);
[2.2]byte,char,short 型,计算(int);
[2.3]long 型,计算(int) (f ^ (f>>>32));
[2.4]float 型,计算 Float.floatToIntBits ( afloat ) ;
[2.5]double 型,计算 Double.doubleToLongBits ( adouble ) 得到一个long ,再执行[2.3];
[2.6] 对象引用,递归调用它的hashCode 方法;
[2.7] 数组域,对其中每个元素调用它的hashCode 方法。
[3] 将上面计算得到的散列码保存到int 变量c ,然后执行 result=37*result+c;
[4] 返回result 。
例子:
class Unit {
private short ashort ;
private char achar ;
private byte abyte ;
private boolean abool ;
private long along ;
private float afloat ;
private double adouble ;
private Unit aObject ;
private int [] ints ;
private Unit [] units ;
public boolean equals ( Object o ) {
if ( ! ( o instanceof Unit ))
return false ;
Unit unit = ( Unit ) o ;
return unit. ashort == ashort
&& unit. achar == achar
&& unit. abyte == abyte
&& unit. abool == abool
&& unit. along == along
&& Float.floatToIntBits ( unit. afloat ) == Float
.floatToIntBits ( afloat )
&& Double.doubleToLongBits ( unit. adouble ) == Double
.doubleToLongBits ( adouble )
&& unit. aObject . equals ( aObject ) && equalsInts ( unit. ints )
&& equalsUnits ( unit. units ) ;
}
private boolean equalsInts ( int [] aints ) {
return Arrays.equals ( ints , aints ) ;
}
private boolean equalsUnits ( Unit [] aUnits ) {
return Arrays.equals ( units , aUnits ) ;
}
public int hashCode () {
int result = 17;
result = 31 * result + ( int ) ashort ;
result = 31 * result + ( int ) achar ;
result = 31 * result + ( int ) abyte ;
result = 31 * result + ( abool ? 0 : 1 ) ;
result = 31 * result + ( int ) ( along ^ ( along >>> 32 )) ;
result = 31 * result + Float.floatToIntBits ( afloat ) ;
long tolong = Double.doubleToLongBits ( adouble ) ;
result = 31 * result + ( int ) ( tolong ^ ( tolong >>> 32 )) ;
result = 31 * result + aObject . hashCode () ;
result = 31 * result + intsHashCode ( ints ) ;
result = 31 * result + unitsHashCode ( units ) ;
return result;
}
private int intsHashCode ( int [] aints ) {
int result = 17;
for ( int i = 0; i < aints . length ; i++ )
result = 31 * result + aints [ i ] ;
return result;
}
private int unitsHashCode ( Unit [] aUnits ) {
int result = 17;
for ( int i = 0; i < aUnits . length ; i++ )
result = 31 * result + aUnits [ i ] . hashCode () ;
return result;
}
}
为什么要用 31 这个数呢?因为它是个奇素数。如果乘以偶数,并且乘法溢出的话,信息就会丢失,因为与 2 相乘等价于移位运算。使用素数效果不是很明显,但是习惯上都是使用素数计算散列结果。 31 有个好处的特性,即用移位代替乘法,可以得到更好的性能: 31*I = = ( I << 5 ) - I 。现代的 VM 可以自动完成这样优化。 ——《 Effctive java SE 》
五. 注意:
1.equals ()不相等的两个对象,却并不能证明他们的hashcode() 不相等。
换句话说,equals() 方法不相等的两个对象,hashcode() 有可能相等
2.hashcode() 不等,一定能推出equals() 也不等;hashcode() 相等,equals() 可能相等,也可能不等。
六. 参考:
1. http://www.cnjm.net/tech/article4731.html
2. http://zhangjunhd.blog.51cto.com/113473/71571
Object 、 equals() 、 hashCode ()
二. 为什么需要重写:
众所周知, Object 是所有类的父类。但,我们在实际开发中自定义自己类时,往往需要重写 Object 中 equals 和 hashCode 方法。为什么呢?首先看看 Object 的 API 吧。
Object 类中原始写法是:
public boolean equals ( Object obj ) {
return ( this == obj ) ;
}
可见,原始 equals 比较的是 2 个对象的“内存地址”。但,我们往往是需要判断的是“逻辑上的内容”是否相等,如: String 、 Integer 、 Math... 等等,时而我们关心是逻辑内容上是否相等,而不关心是否指向同一对象,所以所要重写。
再者,尽管 Object 是一个具体的类,但是设计它主要是为了扩展。它所要的非 final 方法( equals hashCode toString clone 和 finalize )都有通用约定( general contract ),因为它们被设计成要被覆盖( override )的。任何一个类,它在覆盖这些方法的时候,都有责任遵守这些通用的约定;如果不能做到这一点,其它依赖这些约定的类(例如 HashMap 和 HashSet )就无法结合该类一起正常运行。
JDK API 上重写 equals 约定如下:
自反性 :
对于任何非空引用值 x ,x.equals(x) 都应返回 true 。
对称性 :
对于任何非空引用值 x 和 y ,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应返回 true 。
传递性 :
对于任何非空引用值 x 、y 和 z ,如果 x.equals(y) 返回 true ,并且 y.equals(z) 返回 true ,那么 x.equals(z) 应返回 true 。
一致性 :
对于任何非空引用值 x 和 y ,多次调用 x.equals(y) 始终返回 true 或始终返回 false ,前提是对象上 equals 比较中所用的信息没有被修改。
对于任何非空引用值 x ,x.equals(null) 都应返回 false
同时, API 规定“ 当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码 “所以也要重写 hashCode 方法。
public native int hashCode () ;
说明是一个本地方法,它的实现是根据本地机器相关的,方法返回的是对象的地址值。时而重写 hashCode 一是为了遵守 API 约定,二是重点提高对象比较时效率。
因为,在 java 集合对象中比较对象是这样的,如 HashSet 中是不可以放入重复对象的,那么在 HashSet 中又是怎样判定元素是否重复的呢?让我们看看源代码(首先要知道 HashSet 内部实际是通过 HashMap 封装的):
public boolean add ( Object o ) { //HashSet 的 add 方法
return map.put ( o, PRESENT ) == null ;
}
public Object put ( Object key, Object value ) { //HashMap 的 put 方法
Object k = maskNull ( key ) ;
int hash = hash ( k ) ;
int i = indexFor ( hash , table.length ) ;
for ( Entry e = table [ i ] ; e != null ; e = e.next ) {
if ( e.hash == hash && eq ( k, e.key )) { // 从这里可见先比较 hashcode
Object oldValue = e.value;
e.value = value;
e.recordAccess ( this ) ;
return oldValue;
}
}
modCount++;
addEntry ( hash , k, value, i ) ;
return null ;
}
所以在 java 的集合中,判断两个对象是否相等的规则是:
1 ,判断两个对象的 hashCode 是否相等
如果不相等,认为两个对象也不相等,完毕
如果相等,转入 2
2 ,判断两个对象用 equals 运算是否相等
如果不相等,认为两个对象也不相等
如果相等,认为两个对象相等
为什么是两条准则,难道用第一条不行吗?不行,因为 hashCode() 相等时, equals() 方法也可能不等 ,所以必须用第 2 条准则进行限制,才能保证加入的为非重复元素。
三. 例子:
1. 首先
class Student {
String name ;
int age ;
Student ( String name , int age ){
this . name =name ;
this . age =age ;
}
// 没有重写 equals 和 hashCode
}
/**
* @author ydj
* @version Apr 28, 2010 3:12:42 PM
*/
public class OverEqualsHashcodeTest {
public static void main ( String [] args ){
Set < Student > set= new HashSet < Student > () ;
Student stu1= new Student ( "ydj" ,26 ) ;
Student stu2= new Student ( "ydj" ,26 ) ;
set.add ( stu1 ) ;
set.add ( stu2 ) ;
System .out . println ( "set.size():" +set.size ()) ;
}
}
结果是: 2. (这个无须解释)
2. 现在重写 equals 方法如下:
public boolean equals ( Object obj ){
System .out . println ( "--------equals()-----------:" +obj ) ;
if ( obj == null ){
return false ;
}
if ( ! ( obj instanceof Student )){
return false ;
} else {
Student oth= ( Student ) obj ;
return this . age ==oth. age && this . name ==oth. name ;
}
// return true;
}
结果是: 2. (为什么依然是 2 呢?!为什么连 equals 方法都没调用呢)
分析: 这就是为什么要重写 hashCode 的原因( 相等对象必须具有相等的哈希码 )。因为现在的 hashCode 依然返回各自对象的地址,就是说明此时的 hashCode 肯定不相等,故根本不会调用 equals ()。
3. 重写 hashCode 方法如下:
public int hashCode (){
int res=17;
res=31*res+ age ;
res=31*res+ name . hashCode () ;
return res;
}
结果是: 1.
如果这样重写 hashCode :
public int hashCode (){
int res= ( int )( Math.random () *100 ) ;
return res;
}
这样的话,就等于没有重写了。
四. 设计 equals ()和 hashCode ():
A .设计equals()
[1] 使用instanceof 操作符检查“实参是否为正确的类型”。
[2] 对于类中的每一个“关键域”,检查实参中的域与当前对象中对应的域值。
[2.1] 对于非float 和double 类型的原语类型域,使用== 比较;
[2.2] 对于对象引用域,递归调用equals 方法;
[2.3] 对于float 域,使用 Float.floatToIntBits ( afloat ) 转换为int ,再使用== 比较;
[2.4] 对于double 域,使用 Double.doubleToLongBits ( adouble ) 转换为int ,再使用== 比较;
[2.5] 对于数组域,调用Arrays.equals 方法。
B. 设计hashCode()
[1] 把某个非零常数值,例如17 ,保存在int 变量result 中;
[2] 对于对象中每一个关键域f (指equals 方法中考虑的每一个域):
[2.1]boolean 型,计算(f ? 0 : 1);
[2.2]byte,char,short 型,计算(int);
[2.3]long 型,计算(int) (f ^ (f>>>32));
[2.4]float 型,计算 Float.floatToIntBits ( afloat ) ;
[2.5]double 型,计算 Double.doubleToLongBits ( adouble ) 得到一个long ,再执行[2.3];
[2.6] 对象引用,递归调用它的hashCode 方法;
[2.7] 数组域,对其中每个元素调用它的hashCode 方法。
[3] 将上面计算得到的散列码保存到int 变量c ,然后执行 result=37*result+c;
[4] 返回result 。
例子:
class Unit {
private short ashort ;
private char achar ;
private byte abyte ;
private boolean abool ;
private long along ;
private float afloat ;
private double adouble ;
private Unit aObject ;
private int [] ints ;
private Unit [] units ;
public boolean equals ( Object o ) {
if ( ! ( o instanceof Unit ))
return false ;
Unit unit = ( Unit ) o ;
return unit. ashort == ashort
&& unit. achar == achar
&& unit. abyte == abyte
&& unit. abool == abool
&& unit. along == along
&& Float.floatToIntBits ( unit. afloat ) == Float
.floatToIntBits ( afloat )
&& Double.doubleToLongBits ( unit. adouble ) == Double
.doubleToLongBits ( adouble )
&& unit. aObject . equals ( aObject ) && equalsInts ( unit. ints )
&& equalsUnits ( unit. units ) ;
}
private boolean equalsInts ( int [] aints ) {
return Arrays.equals ( ints , aints ) ;
}
private boolean equalsUnits ( Unit [] aUnits ) {
return Arrays.equals ( units , aUnits ) ;
}
public int hashCode () {
int result = 17;
result = 31 * result + ( int ) ashort ;
result = 31 * result + ( int ) achar ;
result = 31 * result + ( int ) abyte ;
result = 31 * result + ( abool ? 0 : 1 ) ;
result = 31 * result + ( int ) ( along ^ ( along >>> 32 )) ;
result = 31 * result + Float.floatToIntBits ( afloat ) ;
long tolong = Double.doubleToLongBits ( adouble ) ;
result = 31 * result + ( int ) ( tolong ^ ( tolong >>> 32 )) ;
result = 31 * result + aObject . hashCode () ;
result = 31 * result + intsHashCode ( ints ) ;
result = 31 * result + unitsHashCode ( units ) ;
return result;
}
private int intsHashCode ( int [] aints ) {
int result = 17;
for ( int i = 0; i < aints . length ; i++ )
result = 31 * result + aints [ i ] ;
return result;
}
private int unitsHashCode ( Unit [] aUnits ) {
int result = 17;
for ( int i = 0; i < aUnits . length ; i++ )
result = 31 * result + aUnits [ i ] . hashCode () ;
return result;
}
}
为什么要用 31 这个数呢?因为它是个奇素数。如果乘以偶数,并且乘法溢出的话,信息就会丢失,因为与 2 相乘等价于移位运算。使用素数效果不是很明显,但是习惯上都是使用素数计算散列结果。 31 有个好处的特性,即用移位代替乘法,可以得到更好的性能: 31*I = = ( I << 5 ) - I 。现代的 VM 可以自动完成这样优化。 ——《 Effctive java SE 》
五. 注意:
1.equals ()不相等的两个对象,却并不能证明他们的hashcode() 不相等。
换句话说,equals() 方法不相等的两个对象,hashcode() 有可能相等
2.hashcode() 不等,一定能推出equals() 也不等;hashcode() 相等,equals() 可能相等,也可能不等。
六. 参考:
1. http://www.cnjm.net/tech/article4731.html
2. http://zhangjunhd.blog.51cto.com/113473/71571
发表评论
-
对文件压缩加密/解密解压缩的例子,DES/RSA [转]
2013-11-15 17:52 1010RSA压缩加密/解压缩解密 import java.io.Fi ... -
oracle.sql.TIMESTAMP 处理日期 [转]
2013-10-09 13:37 1229个人觉得Oracle有些“独裁”在日期类型对象方面,自己的JD ... -
Deployment failure on Tomcat 6.x. Could not copy all resources
2013-02-18 10:52 1559在myeclipse 部署项目的时候报:Deployment ... -
Java用native2ascii命令做unicode编码转换
2012-11-15 18:57 881背景:在做Java开发的时候,常常会出现一些乱码,或者无法正确 ... -
控制台有如下信息:handling transient entity in delete processing
2012-10-24 11:28 3903通过dao的get方法得到了相应的永续对象,再用dao的del ... -
hibernate中get方法和load方法的根本区别
2012-10-23 11:27 752hibernate中get方法和load方 ... -
weblogic与websphere的区别———转
2012-09-17 17:04 14341. 可靠性,可扩展性,可用性 根据最近的公开评测和客 ... -
struts2 <s:property/>标签的使用--输出时间格式转换
2012-09-12 15:17 24451.按需输出特定长度的字符 例:<s:property ... -
struts2 标签
2012-09-11 16:49 876Struts2常用标签总结 一 ... -
ids for this class must be manually assigned before calling save()..
2012-09-06 11:39 830引起问题的原因: 由Hibernate根据数据库表自动生成的& ... -
MyEclipse自动提示设置、spring 自动提示
2012-09-04 10:18 2283环境:MyEclipse 6.5 问题 ... -
MyEclipse中删除添加的Hibernate Capabilities
2012-09-03 16:33 1004我是通过菜单MyEclipse->Project Cap ... -
JSP中的两种包含页面的方法
2012-09-03 10:16 696[java] view plaincopy //第一种:inc ... -
log4j的配置详解
2012-08-30 11:05 709第一步:加入log4j-1.2.8.j ... -
weblogic搭建环境遇到的错误
2012-07-26 16:47 51862012-07-23 16:31:54,587 ERROR [ ... -
Sun 自带的Gzip压缩解压xml实例
2012-07-16 17:27 1067import java.io.BufferedInputStr ... -
linux 安装 jrmc
2012-07-16 11:24 1007下载jrockit-jdk1.6.0_20-R28.1.0-4 ... -
启动一个线程是用run()还是start()? 为什么?
2012-06-29 17:12 1336启动线程肯定要用start()方法。当用start()开始一个 ... -
hibernate延迟加载
2012-06-21 17:04 740延迟加载: 首先说明Hibernate3延迟加载只对其中的l ... -
tomcat 启动时加载项目
2012-05-30 15:22 767启动加载项目配置 在server.xml中添加如下: < ...
相关推荐
以下是对`equals()` 和 `hashCode()` 方法的详细解释及其重写的重要性。 **1. equals() 方法** `equals()` 方法用于比较两个对象是否相等。默认情况下,`equals()` 检查两个对象是否是同一个对象(即内存地址是否...
重写equals()、hashcode()和compareTo()方法是非常重要的,它可以使我们的程序更加高效、可靠和灵活。在实际开发中,我们需要根据具体情况来决定是否需要重写这些方法,并遵守相关的规则,以避免出现意想不到的结果...
Java重写equals同时需要重写hashCode的代码说明,以及如何重写hashCode方法,此代码演示按照effective java书籍说明的重写思路。代码中演示了使用集合存储对象,并且对象作为key,需重写equals和hashCode.
在实际开发中,我们经常需要重写equals和hashCode方法,以便于正确地比较和存储对象。下面是一个简单的示例代码: public class Student { private String name; private int age; private String QQ; @...
为什么重写equals方法,还必须要重写hashcode方法
这就是为什么在设计类时,重写这两个方法是至关重要的,尤其是在实现集合类的元素或键值对时。 总之,理解并正确重写 `equals()` 和 `hashCode()` 方法对于编写高质量的Java代码至关重要,这直接影响到对象比较的...
为什么需要重写 equals 和 hashCode 方法? 在 Object 类中,equals 方法的原始实现是: public boolean equals(Object obj) { return (this == obj); } 这个方法是比较两个对象的内存地址,而不是逻辑内容。...
在 TestEqualsHashCode.java 文件中,通常会包含一个示例,演示如何正确地重写 `equals()` 和 `hashCode()` 方法。这个文件可能包含一个自定义类,并展示如何根据类的属性定义这两个方法,以实现特定的比较逻辑。 ...
equals 方法和 hashCode 方法是 Java 语言中两个重要的方法,它们都是在 Object 类中定义的。equals 方法用于比较两个对象是否相等,而 hashCode 方法用于返回对象的哈希码。 在 Java 的 Object 类中,equals 方法...
3、**为什么要重写equals()方法?** 默认情况下,`equals()`方法继承自`Object`类,比较的是对象的引用。在处理自定义类时,我们可能关心的是对象的属性是否相等,而不是它们的内存地址。因此,为了基于对象的内容...
什么时候需要重写 equals 方法? ------------------------- 第一种情况:如果类中提供的 equals 方法无法满足需求,则需要重写 equals 方法。例如,在 String 类中,equals 方法用于比较两个字符串的内容是否相同...
下面是一个简单的示例代码,演示了如何重写 equals 和 hashCode 方法: ```java public class Person { @Override public boolean equals(Object obj) { System.out.println("判断 Person 的 equals"); return ...
总之,重写 `equals` 和 `hashCode` 方法是保证自定义对象在集合中正确比较和存储的关键。这样做不仅可以满足特定的业务需求,还能确保集合操作的正确性和效率。在实现类时,应始终注意这两个方法的配合使用,以遵循...
在 Java 中,重写 equals() 方法和 hashCode() 方法是非常重要的,它们可以确保对象的比较和标识正确。如果我们违反了这两个方法的规则,那么可能会产生理解的不一致。因此,在编写 Java 代码时,需要严格遵守这两个...
在Java编程语言中,`equals()`和`hashCode()`方法是对象的基本组成部分,它们主要用于对象的比较和存储。这两个方法在`java.lang.Object`类中定义,因此所有的Java类都默认继承了这两个方法。然而,根据具体的应用...
如果我们重写了`equals()`方法来基于`name`和`age`判断两个`Coder`对象是否相等,那么我们也应该重写`hashCode()`,使具有相同`name`和`age`的`Coder`对象产生相同的哈希码。通常,`hashCode()`的实现会结合所有参与...
在这个类中,很可能已经重写了`equals()`, `hashCode()` 和 `toString()` 方法,以便更好地处理对象的比较、哈希存储和输出信息。 为了实现`DBObject`类的正确行为,开发者可能考虑了以下几点: 1. 在`equals()`...
通常情况下,hashcode 方法需要和 equals 方法一起使用,以确保两个对象的散列码相同,如果它们的内容相同。 例如,在 HashSet 中,我们可以使用 hashcode 方法来比较两个对象是否相同。如果两个对象的散列码相同,...
重写equals方法需要遵守通用约定,hashCode方法的实现需要保证equals相同的两个对象的hashCode结果一致。ArrayList、Vector和LinkedList是Java中三种常见的容器集合,每种集合都有其特点和应用场景。
现在,让我们深入探讨为什么重写 `equals()` 时要重写 `hashCode()`: 1. **一致性**:一旦对象被创建并赋予了特定的值,其 `equals()` 和 `hashCode()` 方法的结果就应该保持不变,即使在程序的不同执行期间也是...