牛
加載因子是擴(kuò)容的參考標(biāo)準(zhǔn)(threshold = capacity*loadfactor)默認(rèn)數(shù)組初始大小為16,在加載因子為0.75(默認(rèn)值)時(shí),在數(shù)組長(zhǎng)度(size)達(dá)到12就擴(kuò)容,反之,如果把加載因子放大,到1,那么 threshold 就變成16,意味著,在數(shù)組長(zhǎng)度達(dá)到16才會(huì)擴(kuò)容,這時(shí)候也許已經(jīng)產(chǎn)生很多哈希沖突了,導(dǎo)致某些鏈表過長(zhǎng),影響查詢效率。
加載因子過高,雖然提高了空間的利用率,但增加了查詢時(shí)間的成本;加載因子過低,雖然減少查詢時(shí)間的成本,但是空間利用率又很低了。所以0.75是一個(gè)折中的選擇。
鏈表長(zhǎng)度為8轉(zhuǎn)為紅黑樹的原因是,官方根據(jù)泊松分布實(shí)驗(yàn)發(fā)現(xiàn),假設(shè)hashmap長(zhǎng)度length為16,假設(shè)放入12(0.75*16)個(gè)數(shù)據(jù)到hashmap中,鏈表中存放8個(gè)節(jié)點(diǎn)的概率僅為0.00000006,而鏈表中存放1~7節(jié)點(diǎn)的概率為:
0: 0.60653066
1: 0.30326533
2: 0.07581633
3: 0.01263606
4: 0.00157952
5: 0.00015795
6: 0.00001316
7: 0.00000094
從以上可知,實(shí)際上一個(gè)鏈表被放滿8個(gè)節(jié)點(diǎn)的概率非常小,實(shí)際上鏈表轉(zhuǎn)紅黑樹是非常耗性能的,而鏈表在8個(gè)節(jié)點(diǎn)以內(nèi)的平均查詢時(shí)間復(fù)雜度與黑紅樹相差無幾,超過8個(gè)節(jié)點(diǎn),黑紅樹的查詢復(fù)雜度會(huì)好一些。所以,當(dāng)鏈表的節(jié)點(diǎn)大于等于8個(gè)的時(shí)候,轉(zhuǎn)為紅黑樹的性價(jià)比比較合適。
HashMap的loadFactor為什么是0.75?面試core java,HashMap的結(jié)構(gòu)差不多是必問題了。字面意思,真的真的是必問題了。 我遇到的問題有: 1. HashMap, ConcurrentHashM...
都是“生產(chǎn)者-消費(fèi)者”模式
Akka框架簡(jiǎn)介Akka是JAVA虛擬機(jī)平臺(tái)上構(gòu)建高并發(fā)、分布式和容錯(cuò)應(yīng)用的工具包和運(yùn)行時(shí)。Akka用Scala語言編寫,同時(shí)提供了Scala和Java的開發(fā)接口。Akka處理并發(fā)的方法基于...
一、校驗(yàn)數(shù)字的表達(dá)式 數(shù)字:^[0-9]*$ n位的數(shù)字:^\d{n}$ 至少n位的數(shù)字:^\d{n,}$ m-n位的數(shù)字:^\d{m,n}$ 零和非零開頭的數(shù)字:^(0|[...
您好,我想問一下您理解的線程本地緩存和CPU 緩存有什么關(guān)系嗎?
JMM和底層實(shí)現(xiàn)原理1.并發(fā)編程領(lǐng)域的關(guān)鍵問題 1.1 線程之間的通信 線程的通信是指線程之間以何種機(jī)制來交換信息。在編程中,線程之間的通信機(jī)制有兩種,共享內(nèi)存和消息傳遞。在共享內(nèi)存的并發(fā)模型里...
一、通過top 命令查看CPU 的使用情況 二、查看進(jìn)程的信息ps -aux|grep kdevt 三、查詢關(guān)聯(lián)的守護(hù)進(jìn)程 四、kill 掉相關(guān)進(jìn)程 五、刪除對(duì)應(yīng)目錄下的文件...
一、為什么要用redis而不用map做緩存? 緩存分為本地緩存和分布式緩存。map 實(shí)現(xiàn)的是本地緩存,生命周期隨著jvm 的銷毀而結(jié)束,并且在多實(shí)例的情況下,每個(gè)實(shí)例都需要各...
一、常用集合的分類 Collection 接口的接口 對(duì)象的集合(單列集合)├——-List 接口:元素按進(jìn)入先后有序保存,可重復(fù)│—————-├ LinkedList 接口...
查看是否開啟自動(dòng)提交:show variables like 'autocommit';開啟自動(dòng)提交:set autocommit = 1;開始事務(wù):begin;提交事務(wù) :...
MVCC(Multiversion concurrency control )是一種多版本并發(fā)控制機(jī)制,解決了幻讀的問題。 不同存儲(chǔ)引擎的MVCC實(shí)現(xiàn)是不同的,典型的有樂觀(...
一、自增主鍵保存位置 自增主鍵可以讓主鍵索引盡量地保持遞增順序插入,避免了頁分裂,因此索引更緊湊自增主鍵放在非主鍵位置,當(dāng)自增到最大值,則值不會(huì)變化;如果是主鍵位置,當(dāng)自增到...
一、兩個(gè)重要的日志模塊 與查詢流程不一樣的是,更新流程還涉及兩個(gè)重要的日志模塊。 redo log(重做日志) redo log 也是事務(wù)中持久性實(shí)現(xiàn)的原理,它是存儲(chǔ)引擎層的...
零、什么是索引? 索引是幫助MySQL 高效獲取數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu) 索引存儲(chǔ)在文件系統(tǒng)中 索引的文件存儲(chǔ)形式與存儲(chǔ)引擎有關(guān) 索引的文件結(jié)構(gòu)4.1 hash4.2 二叉樹4.3 B...
一、MySQL 的基本架構(gòu)信息 MySQL 的大多數(shù)核心服務(wù)功能,以及所有的內(nèi)置函數(shù)(如日期、時(shí)間、數(shù)據(jù)和加密函數(shù)等),所有跨存儲(chǔ)引擎的功能都在這一層實(shí)現(xiàn),不同的存儲(chǔ)引擎共用...
一、原子性實(shí)現(xiàn)原理 Undo Log(引擎層特有) Undo Log 是為了實(shí)現(xiàn)事務(wù)的原子性,在MySQL 數(shù)據(jù)庫InnoDB 存儲(chǔ)引擎中,還用Undo Log 來實(shí)現(xiàn)多版本...
問題引起的原因:java編譯器檢測(cè)一個(gè)特殊的“內(nèi)部”類何時(shí)被訪問,并拒絕導(dǎo)入該類。Eclipse使用了一個(gè)可能沒有此檢查的不同編譯器。 com.sun.xml.interna...
一、執(zhí)行MyBatis中的SQL 時(shí)Limit 無法算術(shù)的問題。 想要在limit中使用運(yùn)算,那就要用到sql動(dòng)態(tài)語句: