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

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

import java.util.HashMap;
import java.util.Map;

/**
* @author Bingo 
* E-mail:[email protected]
* @version 创建时间:2017年7月3日 上午9:57:49
* 类说明
*/
public class HashMapTest {

	public static void main(String[] args) {
		Map 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相关的说明。

HashMap存入相同key的两种不同的存储方式_第1张图片

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

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

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

HashMap存入相同key的两种不同的存储方式_第2张图片

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

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


你可能感兴趣的:(基础知识)