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