1. 程式人生 > >HashMap 剛學完1.7 1.8就來了 分享一個put方法

HashMap 剛學完1.7 1.8就來了 分享一個put方法

  • put方法

HashMap

首先呢

它是一個集合類,非執行緒安全,key、value(鍵值)對儲存格式。常見的api有put,get,size,remove等方法

在此呢介紹一下jdk1.8中的hashmap.put方法,

我們在使用put方法的時候會傳進key和value引數

在我們將這兩個引數傳入後,

第一步,我們的put方法會去判斷這個hashmap是否為null 或者長度是否為0,

若為null或者長度為0 則新建一個(這也是平時在程式設計過程中需要經常注意的細節),

第二步,就用到了我們這個key值啦,put方法會根據這個key計算hash碼來得到陣列的位置,

(這裡需要解釋一下,我們的hashmap預設是由一個數組加連結串列組成的)

得到位置後當然是繼續判斷這個陣列下標的值是否為null,

為null 自然是直接插入我們的value值,else

第三步,判斷key是否為null,當key!=null我們就可以覆蓋value值,else if

第四步,判斷陣列後面跟著的這個鏈是否為樹(TreeNode),是樹呢,我們傳入的值就會按照key,value的格式存入了,else

第五步,不是樹就是連結串列,那麼put方法就會遍歷這個連結串列,

第六步,在遍歷的時候呢我們會判斷這個連結串列的長度是否大於8,大於呢就會將這個連結串列轉換為樹,再按照key,value的格式存入

第七步,小於則會判斷連結串列中的key!=null,若kay!=null則覆蓋,key==null我們的value就會插入

最後一步為判斷擴容,當陣列容量超過最大容量時就會擴容一倍(即二進位制的進位)

public V put(K key, V value) { return putVal(hash(key), key, value, false, true); }

final V putVal(int hash, K key, V value, boolean onlyIfAbsent,boolean evict) {
    Node<K,V>[] tab; Node<K,V> p; int n, i;
    // 如果table為空,或者還沒有元素時,則擴容
    if ((tab = table) == null || (n = tab.length) == 0)
        n = (tab = resize()).length;
    // 如果首結點值為空,則建立一個新的首結點。

    // 注意:(n - 1) & hash才是真正的hash值,也就是儲存在table位置的index。在1.6中是封裝成indexFor函式。
    if ((p = tab[i = (n - 1) & hash]) == null)
        tab[i] = newNode(hash, key, value, null);
    else {    // 到這兒了,就說明碰撞了,那麼就要開始處理碰撞。
            Node<K,V> e; K k;
            // 如果在首結點與我們待插入的元素有相同的hash和key值,則先記錄。
            if (p.hash == hash && ((k = p.key) == key || (key != null && key.equals(k))))
                e = p;
            else if (p instanceof TreeNode) // 如果首結點的型別是紅黑樹型別,則按照紅黑樹方法新增該元素
                e = ((TreeNode<K,V>)p).putTreeVal(this, tab, hash, key, value);
            else// 到這一步,說明首結點型別為連結串列型別。
                    for (int binCount = 0; ; ++binCount) {
                        // 如果遍歷到末尾時,先在尾部追加該元素結點。
                        if ((e = p.next) == null) {
                            p.next = newNode(hash, key, value, null);
                            // 當遍歷的結點數目大於8時,則採取樹化結構。
                            if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1st
                                treeifyBin(tab, hash);
                                break;
                        }
                        // 如果找到與我們待插入的元素具有相同的hash和key值的結點,則停止遍歷。此時e已經記錄了該結點
                        if (e.hash == hash && ((k = e.key) == key || (key != null && key.equals(k))))
                            break;
                        p = e;
                    }
                }
            // 表明,記錄到具有相同元素的結點
            if (e != null) { // existing mapping for key
                V oldValue = e.value;
                if (!onlyIfAbsent || oldValue == null)
                    e.value = value;
                afterNodeAccess(e);  // 這個是空函式,可以由使用者根據需要覆蓋
                return oldValue;
            }
        }
    ++modCount;
    // 當結點數+1大於threshold時,則進行擴容
    if (++size > threshold)
        resize();
    afterNodeInsertion(evict); // 這個是空函式,可以由使用者根據需要覆蓋
    return null;
}

相關推薦

HashMap 1.7 1.8 分享一個put方法

put方法HashMap首先呢它是一個集合類,非執行緒安全,key、value(鍵值)對儲存格式。常見的api有put,get,size,remove等方法在此呢介紹一下jdk1.8中的hashmap.put方法,我們在使用put方法的時候會傳進key和value引數在我們將

java 1.7 1.8新特性

val row def jce arr app 線程安全 動態 adl 在JDK1.7的新特性方面主要有下面幾方面的增強:1.jdk7語法上1.1二進制變量的表示,支持將整數類型用二進制來表示,用0b開頭。1.2 Switch語句支持string類型1.3 Try-with

1.5-1.6-1.7-1.8-線性時不變LTI系統

線性時不變系統 本文引自《數字訊號處理 【美】 Richad G. Lyons》 眾所周知,LTI系統官方定義。 線性系統的例子: 假設 y(n)= - x(n) / 2 輸出序列是輸入序列取反後的1/2 輸入x1 : 1Hz -------------------輸出:

JDK(1.6,1.7,1.8,10,11)64位解壓版配置使用

JDK(1.6,1.7,1.8,10,11)64位解壓版配置使用 安裝jdk解壓版 下載jdk地址   連結: https://pan.baidu.com/s/1sm8O5dF 密碼: 86p4 將下載的javaSE(1.6,1.7,1.8,10,11其中一種)解壓

1.7~1.8學習筆記

requests.request()構造一個請求,支撐以下各方法的基礎方法 requests.get()獲取HTML網頁的主要方法,對應於HTTP的GET requests.head()獲取HTML網頁頭資訊的方法,對應於HTTP的HEAD requests.post()向HTML網頁提

jdk 1.5 1.6 1.7 1.8 1.9的新特性詳解帶例子

1.5 1.自動裝箱與拆箱: 2.列舉(常用來設計單例模式) 3.靜態匯入 4.可變引數 5.內省 1.6 1.Web服務元資料 2.指令碼語言支援 3.JTable的排序和過濾 4.更簡單,更強大的JAX-WS 5.輕量級Http Serv

jdk1.6 1.7 1.8 LinkedList原始碼實現原理及區別

LinkedList(jdk1.6) private transient Entry<E> header = new Entry<E>(null, null, null); 定義一個空的Entry物件作為頭結點,Entry是其內部

pixel和nexus設備安卓9.0/8.1/7.1.x/6.x WiFi和信號圖標出現叉x號或者感嘆號的消除辦 法

連接 glob spa 8.0 菜單 thread 打開 col 支持 在安卓9.0/8.1/8.0/7.1.2裏如何消除x號(在老一點點版本是感嘆號)呢? 1.首先開啟usb調試,然後用數據線連接電腦和手機。 2.然後解決好您的adb驅動問題,具體教程見:http://w

jdk1.6,1.7,1.8解壓版無需安裝(64位)

jdk1.6,1.7,1.8解壓使用版64位無需安裝,歡迎下載連結:https://pan.baidu.com/s/1qG2CjTI4maF78zz8PPiWag 密碼:jj67也可以使用下面的連結下載安裝:1、java SE 1.6各個版本 jdk http://www.o

appium 1.7.1鏈接真機測試記錄

appium鏈接真機測試記錄ogon:~ zhouhaijun$ appium[Appium] Welcome to Appium v1.7.1[Appium] Appium REST http interface listener started on 0.0.0.0:4723[HTTP] --> P

[rk3288][Android5.1/7.1] LCD 相容

相容方案 定做LCD fpc 該方案是硬體設計時預留幾個gpio,不同廠家的屏對不同的gpio進行上拉或者下拉,將上下拉電阻直接貼到fpc上, 系統啟動時讀取gpio電平進行判斷。 優點: 硬體更改版號時不需要考慮屏的區別,軟體無需單獨出版本,生產時也沒有燒錄錯誤的風險,該方

Nginx實戰 1.7-1.11 Nginx架構分析,虛擬機器配置

1.7-1.9 Nginx架構分析 Nginx模組化結構 Nginx涉及到的模組分為核心模組、標準HTTP模組、可選HTTP模組、郵件服務模組以及第三方模組等五大類。 核心模組 核心模組是指Nginx伺服器正常執行時必不可少的模組,它們提供了Nginx最基本最核心的服務,如程序管理、許可

#006# 快速排序 × 演算法導論(第三版)練習 7.1-1 ~ 7.1-4

快排採用經典的分治思想,具體如下↓ 分解:快排的核心步驟,其結果是陣列被分成以某個數為基準的左右兩個子陣列(可能為空),其中左邊的數都小於該基準數,右邊的數都大於該基準數。詳細步驟包括計算基準數下標,以及移動陣列內元素。 解決:通過遞迴呼叫快速排序,對兩個子陣列進行排序。 合併:因為是原址排序,快速排序

HashMap實現原理(jdk1.7/jdk1.8

HashMap的底層實現:  1、簡單回答    JDK1.7:HashMap的底層實現是:陣列+連結串列  JDK1.8:HashMap的底層實現是:陣列+連結串列/紅黑樹     為什麼要紅黑樹?  紅黑樹:一個自平衡的二

Chern大大你好~!偶然機會拜讀你的文章覺得很棒~!也給小弟很大的激勵,因為我也是半路出家轉從土木轉資工,今年有幸考上資工研究所,目前才剛學完C語言,而對於未來要走的領域有點茫然,想請教您有提到j…

Chern大大你好~!偶然機會拜讀你的文章覺得很棒~!也給了小弟很大的激勵,因為我也是半路出家轉從土木轉資工,今年有幸考上資工研究所,目前才剛學完C語言,而對於未來要走的領域有點茫然,想請教您有提到jserv的系統軟體課程,對於他的課程小弟是滿喜歡的也有在跟著寫作業,未來也想朝這方面前進,但因為他的課程算比較

noip初賽整理1.6&1.7&1.9(進位制轉換&資訊編碼表示&原碼補碼反碼)

進位制轉換  基數與權         基數:某進位制計數制允許的基本數學符號的個數。一般而言,J進位制數的基數是J。         位權(權):...(無聊定義賊長)。如 11010 B 的權從高到低為16,8,4,2,1。 字尾字母          B:二進

Apache Flink 1.7.1 釋出,開源流處理框架

   Apache Flink 1.7.1 已釋出,此版本包括27項修復及針對 Flink 1.7.0 的小改進。建議所有使用者升級。Apache Flink 是一個開源的流處理框架,應用於分散式、高效能、始終可用的、準確的資料流應用程式。 Sub-task [FLINK-

漢語言處理包 HanLP 1.7.1 釋出,快取生成提速37倍

   HanLP 是由一系列模型與演算法組成的 Java 工具包,目標是普及自然語言處理在生產環境中的應用。HanLP 具備功能完善、效能高效、架構清晰、語料時新、可自定義的特點。 在提供豐富功能的同時,HanLP 內部模組堅持低耦合、模型堅持惰性載入、服務堅持靜態提供、詞典堅

已知一個函式rand7()能夠生成1-7的隨機數,請給出一個函式rand10(),該函式能夠生成1-10的隨機數。

題目:已知一個函式rand7()能夠生成1-7的隨機數,請給出一個函式,該函式能夠生成1-10的隨機數。思路:假如已知一個函式能夠生成1-49的隨機數,那麼如何以此生成1-10的隨機數呢?解法:該解法基於一種叫做拒絕取樣的方法。主要思想是隻要產生一個目標範圍內的隨機數,則直接返回。如果產生的隨機數不在目標範圍

Kubernetes 1.7.1 版本釋出_Kubernetes中文社群

Kubernetes 1.7.1版本釋出,相對 1.7 版本以來,1.7.1 版本修復了COS影象在GCI / GKE上掛載NFS或glusterFS卷問題(#42376),kubeadm init和kubeadm join添加了新的標示(#48594)(#48538),等共計8項的更新。 K