1. 程式人生 > >HashMap存入相同key的兩種不同的儲存方式

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<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即可。