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

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


  • 6
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值