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

還有些話,后文再聊吧。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM