HashMap存入相同key的兩種不同的儲存方式
阿新 • • 發佈:2018-12-23
今天在看《程式設計思想》關於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即可。