為什麼HashMap中連結串列長度超過8會轉換成紅黑樹
HashMap在jdk1.8之後引入了紅黑樹的概念,表示若桶中連結串列元素超過8時,會自動轉化成紅黑樹;若桶中元素小於等於6時,樹結構還原成連結串列形式。
原因:
紅黑樹的平均查詢長度是log(n),長度為8,查詢長度為log(8)=3,連結串列的平均查詢長度為n/2,當長度為8時,平均查詢長度為8/2=4,這才有轉換成樹的必要;連結串列長度如果是小於等於6,6/2=3,雖然速度也很快的,但是轉化為樹結構和生成樹的時間並不會太短。
還有選擇6和8的原因是:
中間有個差值7可以防止連結串列和樹之間頻繁的轉換。假設一下,如果設計成連結串列個數超過8則連結串列轉換成樹結構,連結串列個數小於8則樹結構轉換成連結串列,如果一個HashMap不停的插入、刪除元素,連結串列個數在8左右徘徊,就會頻繁的發生樹轉連結串列、連結串列轉樹
相關推薦
為什麼HashMap中連結串列長度超過8會轉換成紅黑樹
開發十年,就只剩下這套架構體系了! >>>
(轉)為什麽HashMap中鏈表長度超過8會轉換成紅黑樹
假設 n) net hashmap 頻繁 發生 等於 pan tails 原博地址:https://blog.csdn.net/xingfei_work/article/details/79637878 HashMap在jdk1.8之後引入了紅黑樹的概念,表示若桶中鏈表
Java 集合深入理解(17):HashMap 在 JDK 1.8 後新增的紅黑樹結構
上篇文章我們介紹了 HashMap 的主要特點和關鍵方法原始碼解讀,這篇文章我們介紹 HashMap 在 JDK1.8 新增樹形化相關的內容。 讀完本文你將瞭解到: 傳統 HashMap 的缺點 JDK 1.8 以前 HashMap 的實
HashMap 在 JDK 1.8 後新增的紅黑樹結構
讀完本文你將瞭解到: 傳統 HashMap 的缺點 JDK 1.8 以前 HashMap 的實現是 陣列+連結串列,即使雜湊函式取得再好,也很難達到元素百分百均勻分佈。 當 HashMap 中有大量的元素都存放到同一個桶中時,這個桶下有一條長長的連結串列,這個
【Java原始碼】集合類-JDK1.8 雜湊表-紅黑樹-HashMap總結
JDK 1.8 HashMap是陣列+連結串列+紅黑樹實現的,在閱讀HashMap的原始碼之前先來回顧一下大學課本資料結構中的雜湊表和紅黑樹。 什麼是雜湊表? 在儲存結構中,關鍵值key通過一種關係f和唯一的儲存位置相對應,關係f即雜湊函式,Hash(k)=f(k)。按這個思想建立的表就是雜湊表。 當有兩個
jdk1.8 HashMap 實現 陣列+連結串列/紅黑樹(預設桶中長度大於8時)
轉載至 http://www.cnblogs.com/leesf456/p/5242233.html 一、前言 在分析jdk1.8後的HashMap原始碼時,發現網上好多分析都是基於之前的jdk,而Java8的HashMap對之前做了較大的優化,其中最重要的一個優化就是
HashMap桶中連結串列轉紅黑樹為什麼選擇數字8?
在JDK8及以後的版本中,HashMap引入了紅黑樹結構,其底層的資料結構變成了陣列+連結串列或陣列+紅黑樹。新增元素時,若桶中連結串列個數超過8,連結串列會轉換成紅黑樹。 翻了一下HashMap的原始碼,發現其原始碼中有這樣一段註釋: Because Tre
C++類中單鏈表的實現(頭插、尾插、頭刪、尾刪、指定位置插入、指定位置刪除、連結串列長度、清空連結串列、連結串列排序)
#include<iostream> using namespace std; class Node { public:Node():next(NULL){}Node(int n,Node *p = NULL):value(n),next(p){}int val
jdk1.8原始碼解析:HashMap底層資料結構之連結串列轉紅黑樹的具體時機
前言 本文從三個部分去探究HashMap的連結串列轉紅黑樹的具體時機: 一、從HashMap中有關“連結串列轉紅黑樹”閾值的宣告; 二、【重點】解析HashMap.put(K key, V value)的原始碼; 三、測試; 一、從
Linux核心中連結串列的設計思路
一般實際專案中的連結串列,節點中儲存的資料其實是一個結構體,這個結構體中包含若干的成員,這些成員加起來構成了我們的節點資料區域。 實際上鍊表操作是相同的,而涉及到資料區域的操作就有不同。 鑑於以上2點,能不能有一種辦法把所有連結串列中操作方法裡共同的部分提取出來用一套標準方法實現,然
【連結串列問題】單向連結串列判斷是否有環、求入環節點、求環長、求連結串列長度
目錄 題目: 思路: 程式碼實現 注意點 此題的其他變式 題目 判斷一個單項鍊表是否有環,如果有環,返回入環節點的值,如果無環,返回-1.要求空間複雜度為O(1). 思路 空間複雜度如果沒有要求, 可以用雜湊表來判斷。 在空間複雜度為O(
常見演算法:C語言中連結串列的操作(建立,插入,刪除,輸出)
連結串列中最簡單的一種是單向連結串列,它包含兩個域,一個資訊域和一個指標域。這個連結指向列表中的下一個節點,而最後一個節點則指向一個空值。 一個單向連結串列包含兩個值: 當前節點的值和一個指向下一個節點的連結 一個單向連結串列的節點被分成兩個部分。第一個部分儲存或者顯示關於
HashMap-陣列+連結串列集合
field 常量 //預設初始化容量,最好為2的冪 static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16 //最大容量 static f
java中連結串列功能的實現
今天我們學習了java的連結串列資料結構的實現,建立一個Node類,裡面定義資料和一個Node類,然後是構造方法傳值。 類裡面定義4個方法,分別可以獲取和設定類的Node類指向和資料。 然後再建立一個MyLinkList類來定義我自己的操作連結串列資料結構的方法,分別由增刪
計算連結串列長度
#include<stdio.h> #include<stdlib.h> typedef struct student { int num; struct student *next; }Lstudent,*LPstudent; v
連結串列的c語言實現以及根據linux核心中連結串列的實現過程
轉自 : http://blog.csdn.net/lickylin/article/details/8010618 連結串列,就是用一組任意的儲存單元儲存線性表元素的一種資料結構。連結串列又分為單鏈表、雙向連結串列和迴圈連結串列等。 下面程式碼是連結串列的兩種實現方式
JAVA中連結串列的實現
以下程式碼是建立一個連結串列並輸出,其中主要用到了內部類,連結串列的實現是面試中常常遇到的問題,除了連結串列輸出外也可能遇到連結串列的刪除、查詢等,參照連結串列的輸出,其他的功能實現並不難。 import java.util.ArrayList; import java.u
Java中連結串列相關演算法
如下為連結節點,後續都用此表示連結節點 class ListNode{ int value; ListNode next; public ListN
JAVA8 hashmap原始碼閱讀筆記(紅黑樹連結串列)
一:hashmap的13 個成員變數 static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; -> 陣列預設初始容量:16 static final int MAXIMUM_CAPACITY
為什麼Map桶中個數超過8才轉為紅黑樹
要弄明白這個問題,我們首先要明白為什麼要轉換,這個問題比較簡單,因為Map中桶的元素初始化是連結串列儲存的,其查詢效能是O(n),