Java知识分享网 - 轻松学习从此开始!    

Java知识分享网

Java1234官方群25:java1234官方群17
Java1234官方群25:838462530
        
SpringBoot+SpringSecurity+Vue+ElementPlus权限系统实战课程 震撼发布        

最新Java全栈就业实战课程(免费)

springcloud分布式电商秒杀实战课程

IDEA永久激活

66套java实战课程无套路领取

锋哥开始收Java学员啦!

Python学习路线图

锋哥开始收Java学员啦!
当前位置: 主页 > Java文档 > Java基础相关 >

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


分享到:
时间:2020-05-05 09:27来源:http://www.java1234.com 作者:小锋  侵权举报
Java用自定义的类作为HashMap的key值实例详解 PDF 下载
失效链接处理
Java用自定义的类作为HashMap的key值实例详解  PDF 下载

本站整理下载:
 
相关截图:
 
主要内容:

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<Person, String> map = new HashMap<Person, String>(); 
    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"))); 
  } 
}
那么输出结果是什么呢?
{Person@6e4d4d5e=henrylin, Person@275cea3=findingsea, Person@15128ee5=findingsealy, Person@4513098=linyin} 
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类如下:
 
 
25 public 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; 
  } 
}
那么,当我们重新执行上述的检验程序时,得到的结果如下:
 
?
{Person@ba31=findingsea, Person@ba32=linyin, Person@ba33=findingsealy} 
findingsea 
linyin 
findingsealy
 可以看到,之前指出的亮点错误都得到了改正。那么,为什么会这样呢?
在HashMap中,查找key的比较顺序为:
1.计算对象的Hash Code,看在表中是否存在。
 

------分隔线----------------------------

锋哥公众号


锋哥微信


关注公众号
【Java资料站】
回复 666
获取 
66套java
从菜鸡到大神
项目实战课程

锋哥推荐