今天在看《编程思想》关于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;
}
@Override
public 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即可。