1. 程式人生 > 實用技巧 >hashmap 實現 相同的key值時,value值疊加效果。

hashmap 實現 相同的key值時,value值疊加效果。

一,瞭解一些基礎

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方法就能實現疊加的效果。

還有些話,後文再聊吧。