转载
https://juejin.im/post/6844903826122604551
做一个积极的人 编码、改bug、提升自己 我有一个乐园,面向编程,春暖花开!
看似是一个简单的问题,其实里面包含很多的东西!
需求:
实现一个在HashMap中存入(任意类型)相同的key值后,key中的value不会被覆盖,而是能够进行叠加!
拿到一个需求的时候,我们要先进行分析,看此需求能否实现,基于已有的知识(经验),然后在通过目前的一些技术看此需求如何实现。
要实现在HashMap中插入相同的key值,内容不被覆盖,那么肯定要了解HashMap的一些机制,首先看一下HashMap的put方法:
从JDK API中看到HashMap的put如何先前存储了一个key(键),在指定相同的key(键)的时候,会用新的值替换旧的值。
如下的代码示例:
public static void main(String[] args) {
Map<String, Object> map = new HashMap<>();
map.put("aflyun", "Java编程技术乐园");
map.put("aflyun", "生活在长沙的延安人");
System.out.println(map.toString());
}
--打印:--
{aflyun=生活在长沙的延安人}
通过上面的示例分析:为什么存入相同的key后,旧值就被新值替换了呢?
要想知道具体原因,那只能去看HashMap的源码实现了。看一下put(K key, V value)
方法了,本篇HashMap源码是JDK1.8
版本!
/**
* HashMap 的put方法
**/
public V put(K key, V value) {
return putVal(hash(key), key, value, false, true);
}
/**
* HashMap 的containsKey方法
**/
public boolean containsKey(Object key) {
return getNode(hash(key), key) != null;
}
/**
* 将存入的key进行hash操作,也就是使用key.hashCode()!
**/
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
判断put和判断key是否是同一个key的时候,使用大概如下判断逻辑:
if (e.hash == hash && ((k = e.key) == key || (key != null && key.equals(k))))
先判断Hash是否一致,然后在判断传入key和当前集合中是否有相同的key。如果key相同,则新值替换旧值。其中在判断中使用了