java map key值使用类_Java用自定义的类作为HashMap的key值实例详解 PDF

本文探讨使用自定义类作为HashMap键时遇到的问题及解决方法。通过重载equals和hashCode方法确保键的一致性和正确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java用自定义的类作为HashMap的key值实例

更新时间:2016年12月10日 09:43:20   投稿:jingxian    我要评论

下面小编就为大家带来一篇Java用自定义的类作为HashMap的key值实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

这是Java中很经典的问题,在面试中也经常被问起。其实很多书或者文章都提到过要重载hashCode()和equals()两个方法才能实现自定义键在HashMap中的查找,但是为什么要这样以及如果不这样做会产生什么后果,好像很少有文章讲到,所以写这么一篇来说明下。

首先,如果我们直接用以下的Person类作为键,存入HashMap中,会发生发生什么情况呢?

public class Person {

private String id;

public Person(String id) {

this.id = id;

}

}

import java.util.HashMap;

public class Main {

public static void main(String[] args) {

HashMap map = new HashMap();

map.put(new Person("001"), "findingsea");

map.put(new Person("002"), "linyin");

map.put(new Person("003"), "henrylin");

map.put(new Person("003"), "findingsealy");

System.out.println(map.toString());

System.out.println(map.get(new Person("001")));

System.out.println(map.get(new Person("002")));

System.out.println(map.get(new Person("003")));

}

}

那么输出结果是什么呢?

null

null

null

我们可以看到,这里出现了两个问题:

1.在添加的过程中,我们将key=new Person("003")的键值对添加了两次,那么在期望中,HashMap中应该只存在一对这样的键值对,因为key(期望中)是相同的,所以不应该重复添加,第二次添加的value="findingsealy"应该替换掉原先的value="henrylin"。但是在输入中,我们发现期望中的情况并没有出现,而是在HashMap同时存在了value="findingsealy"和value="henrylin"的两个键值对,并且它们的key值还是不相同的,这显然是错误的。

2.在获取value值时,我们分别用三个Person对象去查找,这三个对象和我们刚刚存入的三个key值(在期望中)是相同的,但是查找出的却是三个null值,这显然也是错误的。

那么,正确的方法其实在很多地方都是被描述过了,直接对Person类进行修改,重载equals和hashCode方法,修改过后的Person类如下:

25public class Person {

private String id;

public Person(String id) {

this.id = id;

}

@Override

public boolean equals(Object o) {

if (this == o) return true;

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

Person person = (Person) o;

if (id != null ? !id.equals(person.id) : person.id != null) return false;

return true;

}

@Override

public int hashCode() {

return id != null ? id.hashCode() : 0;

}

}

那么,当我们重新执行上述的检验程序时,得到的结果如下:

?

findingsea

linyin

findingsealy

可以看到,之前指出的亮点错误都得到了改正。那么,为什么会这样呢?

在HashMap中,查找key的比较顺序为:

1.计算对象的Hash Code,看在表中是否存在。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值