HashMap存入相同key的两种不同的存储方式

来源:互联网 发布:邮政小包业务流程优化 编辑:程序博客网 时间:2024/05/22 07:00

今天在看《编程思想》关于HashMap章节的keySet()方法的时候,突然想到一个问题,既然key的存储方式是Set不可重复的,那么如果相同的Key下存储了多个值,源码中对于这样的逻辑是怎样考虑的呢?

import java.util.HashMap;import java.util.Map;/*** @author Bingo * E-mail:riskys@163.com* @version 创建时间:2017年7月3日 上午9:57:49* 类说明*/public class HashMapTest {public static void main(String[] args) {Map<String, Dog> map = new HashMap<>();map.put("zhang", new Dog("zhangmao", 4));map.put("wang", new Dog("wanggou", 3));map.put("zhang", new Dog("zhanggou", 2));map.put("zhang", new Dog("zhangzhu", 1));map.put("wang", new Dog());for (String key : map.keySet()) {System.out.println(map.get(key));}}private static class Dog {private String name;private int age;public Dog() {this("default name", 0);}public Dog(String name, int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return name + " " + age;}}}
输出结果为:


可以看到,并没有输出多个结果,或者输出一个list,表明可能是出现了覆盖,查阅API相关的说明。


表明确实像例子中证明的那样,在插入时,如果原来的key已经存在,则直接将新值覆盖到原值上面。

这样就又有了新的问题:如果我们想要实现相同key的多个value的存储,如何实现呢?

从上面的分析可知:有两个关键的方法:key的hashCode()和map的put()方法,前一个用于比较key是否相同,后一个用于插入方式的实现。


只要重写了key的hashCode()和map的put()方法,应该就可以实现对于相同key下多个value的存储。

具体做法是:由于判断key是否存在的时候是先比较key的hashCode,再比较相等或equals的,所以重写hashCode()和equals()方法即可实现添加重复元素。重写这两个方法之后就可以覆盖重复的键值对,如果需要对value进行叠加,调用put()方法之前用containsKey()方法判断是否有重复的键值,如果有,则用get()方法获取原有的value,再加上新加入的value即可。


原创粉丝点击