java重写hashcode方法代码_Java重写hashCode()的原则及方法

Java重写hashCode()的原则及方法

Java重写hashCode()方法有几个原则:

1、如果两个对象使用equals()方法比较,返回true(即相等),那么两个比较对象返回的hashCode()必须相等。System.out.println(objA.equals(objB));

System.out.printlin(objA.hashCode() == objB.hashCode());

如果objA.equals(objB)为true,那么objA.hashCode== objB.hashCode()也一定为true。

2、多次调用同一对象的hashCode()方法,如果equals()方法里所使用的变量没有任何变化,那么必须返回相同的hashCode值。User user = new User();

user.setAge(10);

int hash1 = user.hashCode();

int hash2 = user.hashCode();

user.setAge(11);

int hash3 = user.hashCode();

假如User的equals()方法使用了age计算,hash1和hash2,age的值同为10,没被修改,那么hash1和hash2相等。计算hash3前,age值修改为11,那么hash3的值可以与之前的hash1和hash2不等,也可以相等。

3、返回hashCode相等的对象,不一定equals()相等,也即是不同对象出现hash值碰撞。注意,一个好的hash算法应该让不同的对象有不同的hash值,这样会提高散列的性能。

重写方法

一般情况下,如果我们重写了类的equals()方法,最好也重写hashCode()方法,并且equals()方法里用到的成员变量也需要在hashCode()里做计算。

hashCode()返回的值对于使用散列存储的结构(如HashTable,HashSet,HashMap)的性能很重要,重写hashCode()方法最好是让不同的对象(即使用equals()不等),返回不同的hashCode的值。

Effective Java的作者推荐使用基于17和31的散列码的算法,如@Override

public boolean equals(Object o) {

if (this == o) return true;

if (o == null || getClass() != o.getClass()) return false;

User user = (User) o;

if (!name.equals(user.name)) return false;

return age == user.age;

}

@Override

public int hashCode() {

int result = 17;

result = 31 * result + name.hashCode();

result = 31 * result + age;

return result;

}

Java 7新增的Objects类提供了计算hashCode的通用方法,可以很简洁实现hashCode@Override

public boolean equals(Object o) {

if (this == o) return true;

if (o == null || getClass() != o.getClass()) return false;

User user = (User) o;

return Objects.equals(name, user.name) &&

Objects.equals(age, user.age);

}

@Override

public int hashCode() {

return Objects.hash(name,age);

}

Java重写hashCode()的原则及方法相关教程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值