关于如何重写hashCode的方法

本文深入解析了在Java中为何及如何重写hashCode方法,通过理解hashCode与equals的关系,提升对象比较效率。

为什么要重写hashCode方法?

 

我们应该先了解java判断两个对象是否相等的规则。

 

在java的集合中,判断两个对象是否相等的规则是:


首先,判断两个对象的hashCode是否相等

如果不相等,认为两个对象也不相等
如果相等,则判断两个对象用equals运算是否相等
如果不相等,认为两个对象也不相等
如果相等,认为两个对象相等

 

我们在equals方法中需要向下转型,效率很低,所以先判断hashCode方法可以提高效率

 

如何重写hashCode方法呢?

 

你可以写

public int hashCode(){
  return 42;
}

 这是一种符合规则的写法,保证了两个equal 的object 拥有相同的hashCode

    但这种方法显然是不可取的

 

比较通用的做法是

返回一个result

 

public int hashCode() {
  int result = 17;  //任意素数
 result = 31*result +c1; //c1,c2是什么看下文解释
  result = 31*result +c2;
  return result;
}

 其中c1,c2是我们生成的你要计算在内的字段的代码,生成规则如下:

如果字段是boolean 计算为(f?1:0);

如果字段是byte,char,short,int则计算为 (int)f;

如果字段是long 计算为 (int)(f^(f>>32));

如果字段是float 计算为 Float.floatToLongBits(f);

如果字段是一个引用对象,那么直接调用对象的hashCode方法,如果需要判空,可以加上如果为空就返回0;
如果字段是一个数组则需要遍历所有元素,按上面几种方法计算;

 

当你写完后hashCode方法后问问自己

1、是否两个equal的实例,拥有相同的jhashCode

2、两个不同的实例,是否拥有相同的hashCode

写一个JUnit Test 测试一下

在 Java 中,当重写 `equals` 方法后,通常也需要重写 `hashCode` 方法,以保证相等的对象具有相同的哈希码,这是 `Object` 类的通用约定。对于 `PassengerWebsocketInfoDTO` 类,若根据 `wsId` 判断对象是否相等,那么 `hashCode` 方法也应基于 `wsId` 来生成哈希码。 以下是重写 `hashCode` 方法后的完整代码: ```java import java.util.Objects; public class PassengerWebsocketInfoDTO { private String wsId; private Long expireTime; // 构造方法 public PassengerWebsocketInfoDTO(String wsId, Long expireTime) { this.wsId = wsId; this.expireTime = expireTime; } // 获取 wsId 的方法 public String getWsId() { return wsId; } // 设置 wsId 的方法 public void setWsId(String wsId) { this.wsId = wsId; } // 获取 expireTime 的方法 public Long getExpireTime() { return expireTime; } // 设置 expireTime 的方法 public void setExpireTime(Long expireTime) { this.expireTime = expireTime; } // 重写 equals 方法 @Override public boolean equals(Object obj) { if (this == obj) { return true; } if (!(obj instanceof PassengerWebsocketInfoDTO)) { return false; } PassengerWebsocketInfoDTO other = (PassengerWebsocketInfoDTO) obj; if (this.wsId == null) { return other.wsId == null; } return this.wsId.equals(other.wsId); } // 重写 hashCode 方法 @Override public int hashCode() { return Objects.hash(wsId); } } ``` 在上述代码中,`hashCode` 方法使用了 `Objects.hash` 方法来生成哈希码。`Objects.hash` 方法会将传入的参数进行哈希计算,返回一个哈希码。由于我们根据 `wsId` 判断对象是否相等,所以只将 `wsId` 作为参数传入 `Objects.hash` 方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值