一,了解一些基礎
package com.ohs.demo; /** * * 一、需求是:停止相同的key值,覆蓋效果,將重復的value值,疊加起來。 * * 二、hash? 什么是hash? * 簡單的說說hashmap,我們都知道, * 1.他提供的PUT 方法在,hashmap中 添加新的元素 * 2.GET 方法可以獲得 key值 對應的 value 值。 * * map 前面 是 hash,那么什么又是hash呢? * 學過數據結構的同學,應該知道,hash是一種數據結構,我們來看一下他的定義、 * * 【哈希算法將任意長度的二進制值映射為較短的固定長度的二進制值,這個小的二進制值稱為哈希值。 * 哈希值是一段數據唯一且極其緊湊的數值表示形式。 * 如果散列一段明文而且哪怕只更改該段落的一個字母,隨后的哈希都將產生不同的值。 * 要找到散列為同一個值的兩個不同的輸入,在計算上是不可能的,所以數據的哈希值可以檢驗數據的完整性。-----------------------------------》 【這里有一個hash碰撞的問題,以后再說】 * 一般用於快速查找和加密算法 ---《數據結構與算法分析》】 * * 簡單的來說,電腦可以理解的都是一些二進制的玩意, 使用hash算法,可以將任意長度的二進制 【映射】為較短的固定的二進制值。 這個小的二進制值,就是我么的哈希值 【壓縮映射】 所占的空間也更小。 * * 也就是說,現在我們,通過查找一個較小的二進制,就能找到原本可能是非常長的二進制文件,就查找的效率上而言,是不是非常的快。 * * 三、哈希表? 什么玩意? * * 定義: * 【散列表(Hash table,也叫哈希表),是根據關鍵碼值(Key value)而直接進行訪問的數據結構。也就是說,它通過把關鍵碼值映射到表中一個位置來訪問記錄,以加快查找的速度。 * 這個映射函數叫做散列函數,存放記錄的數組叫做散列表。】 * * 我的簡單理解, 之前通過hash算法 獲得了一個哈希值,然后我們將很多哈希值放在一張表里面,就組成了一張哈希表。根據這種哈希表,就能快速的找到很多對應的值。 * * * 四 實現需求。 * */ public class HashDemo { }
二,看看hashmap的內心世界
HashMap = 數組 + 鏈表
左邊是數組,右邊是在數組上對應的一些Node 節點。
node 里面 就是一個 key的哈希值 和 對應的value值。
JDK 1.8 的改變? 把我心目中的神 紅黑樹加入進來了!了解即可。
三, 重寫hashmap的 put 方法。
package com.ohs.demo; import java.util.HashMap; /** * 1. 在hashmap中,重復的key值,會被后面的key值對應的value給覆蓋掉。 * (“1”,"哈哈") (”1“,“嘻嘻”) * * 覆蓋的原因? * 我們知道hashmap 的底層是由數組和鏈表實現的。 * 數組查詢的效率遠遠高於鏈表 * 而鏈表的 增 刪 比較方便 * 所以 hashmap 是一個很 優秀的 容器。 * * * put * (”1“,“嘻嘻”) 當一個新的鍵值對,添加到hashmap的時候, * 找到他在數組中對應的位置,然后看在這個位置上的鏈表 * 獲得“ 1 ” 的哈希值,和節點上的哈希值進行比較,找到后,看value 是否存在,有,就實現覆蓋操作。 * 沒有,就添加。 同理,get 方法,就是在里獲得value的值,沒有就是一個 null 值。 注意 value 可以有很多 null 值 * * 【key】值 只有一個是null? * 但是 當 key 值,有很多是空值時,后面的空值,會把前面的空值給覆蓋掉, 類似於put 方法中 的value 值。 也是進行了覆蓋的操作。 * 2.自己創建一個 Myhashmap 讓他繼承 hashmap 重寫它的方法 實現覆蓋的效果。 * */ public class MyHashMap<K> extends HashMap<K,String> { //傳遞一個新的 key value 值 @Override public String put(K key, String value) { // 定義一個新的value 接收 后面put的新的value值 String NewVaule = value; //containsKey 判斷這個 key 是否已經存在? if (containsKey(key)){ // 獲得舊的value 值 String oldValue = get(key); //將舊值 和 后面put 的新值拼接起來 NewVaule = oldValue + "------" +NewVaule; } // 返回拼接后的newvalue return super.put(key, NewVaule); } }
實驗一下?
package com.ohs.demo; import java.util.HashMap; public class DmeoString { public static void main(String[] args) { HashMap hashMap = new HashMap(); hashMap.put("1","龍貓"); hashMap.put("1","千尋"); hashMap.put("2", ""); hashMap.put("3", ""); //haspmap 中 key 值 唯一性的原因 新的 【key = null 】 將 舊的值 給替換了。 hashMap.put("","第一個key是null"); hashMap.put("","第二個可以也是null"); //測試自己沖寫后的put 方法 HashMap MyhashMap = new MyHashMap(); MyhashMap.put("1","龍貓"); MyhashMap.put("1","千尋"); System.out.println(hashMap.toString()); System.out.println("----自定義的MyHashMap方法----"); System.out.println(MyhashMap.toString()); } }
四,重寫 hashCode 和 equals 方法?
注意在上文中 我所用的key 值得類型是 string 類型,然后在自建的MyHashMap 中重寫了一個put 方法。實現了重復的value值 疊加效果,
在string 內部,其實已經重寫了 這兩個方法。所以直接重寫一個put方法就能實現疊加的效果。
還有些話,后文再聊吧。