HashMap,1.7與1.8的區別,HashMap的擴容方式有哪些

HashMap,1.7與1.8的區別

底層數據結構的區別

JDK 1.8之前:

1)JDK1.8 之前HashMap 底層是數組和鏈表結合在一起使用也就是鏈表散列
2)HashMap 通過key 的hashCode 經過擾動函數處理過后得到hash 值,然后通過(n - 1)& hash 判斷當前元素存放的位置(這里的n 指的是數組的長度),如果當前位置存在元素的話,就判斷該元素與要存入的元素的hash 值以及key 是否相同,如果相同的話,直接覆蓋,不相同就通過拉鏈法解決沖突。
3)所謂擾動函數指的就是HashMap 的hash 方法。使用hash 方法也就是擾動函數是為了防止一些實現比較差的hashCode() 方法換句話說使用擾動函數之后可以減少碰撞。

JDK 1.8之后:

當鏈表長度大于閾值(默認為 8)時,會首先調用 treeifyBin()方法。這個方法會根據HashMap 數組來決定是否轉換為紅黑樹。只有當數組長度大于或者等于64 的情況下,才會執行轉換紅黑樹操作,以減少搜索時間。否則,就是只是執行resize() 方法對數組擴容。

擴容機制的區別

一般情況下,當元素數量超過閾值時便會觸發擴容。每次擴容的容量都是之前容量的2 倍。HashMap 的容量是有上限的,必須小于1<<30,即1073741824。如果容量超出了這個數,則不再增長,且閾值會被設置為Integer.MAX_VALUE

JDK7 中的擴容機制:

  • 空參數的構造函數:以默認容量、默認負載因子、默認閾值初始化數組。內部數組是空數組。
  • 有參構造函數:根據參數確定容量、負載因子、閾值等。
  • 第一次put 時會初始化數組,其容量變為不小于指定容量的2 的冪數,然后根據負載因子確定閾值。
  • 如果不是第一次擴容,則 新容量=舊容量x 2 ,新閾值=新容量x 負載因子

JDK8 的擴容機制:

  • 空參數的構造函數:實例化的HashMap 默認內部數組是null,即沒有實例化。第一次調用put 方法時,則會開始第一次初始化擴容,長度為16。
  • 有參構造函數:用于指定容量。會根據指定的正整數找到不小于指定容量的2 的冪數,將這個數設置賦值給閾值(threshold)。第一次調用put 方法時,會將閾值賦值給容量, 然后讓 閾值= 容量x 負載因子
  • 如果不是第一次擴容,則容量變為原來的2 倍,閾值也變為原來的2 倍。(容量和閾值都變為原來的2 倍時,負載因子還是不變)。此外還有幾個細節需要注意:
  • 首次put 時,先會觸發擴容(算是初始化),然后存入數據,然后判斷是否需要擴容;
  • 不是首次put,則不再初始化,直接存入數據,然后判斷是否需要擴容;

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/164574.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/164574.shtml
英文地址,請注明出處:http://en.pswp.cn/news/164574.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

修改el-radio-group樣式,自定義單選組件

修改el-radio-group樣式,自定義單選組件 自定義組件 MyRadioGroup.vue <template><div class"btnsBox"><el-radio-group v-model"activeIndex" change"handleClick"><el-radio-buttonv-for"(item, index) in list&qu…

CSS3動畫

在CSS3中新增了一個很有意思的東西&#xff0c;那就是動畫&#xff0c;有了動畫我們可以做很多的事情&#xff0c;讓我為大家介紹一下動畫吧&#xff01; 本篇文章關于介紹動畫&#xff0c;利用小球移動為你們介紹一下動畫 默認樣式&#xff1a; <!DOCTYPE html> <ht…

普通話考試相關(一文讀懂)

文章目錄&#xff1a; 一&#xff1a;相關常識 1.考試報名時間 2.報名地方 費用 證件 3.考試流程 4.普通話等級說明 二&#xff1a;題型 三&#xff1a;技巧 1.前三題 2.命題說話 四&#xff1a;普通話考試題庫 1.在線題庫 2.下載題庫 一&#xff1a;相關常識 …

JavaEE(SpringMVC)期末復習

文章目錄 JavaEE期末復習一、單選題&#xff1a; JavaEE期末復習 一、單選題&#xff1a; 1.Spring的核?技術是&#xff08; A &#xff09;&#xff1f; A依賴注入 B.JdbcTmplate C.聲明式事務 D.資源訪問 Spring的核心技術包括依賴注入&#xff08;Dependency Injection&am…

【前端】js通過canvas獲取瀏覽器的唯一指紋可以當做唯一標識

【前端】js通過canvas獲取瀏覽器的唯一指紋可以當做唯一標識 <!DOCTYPE html> <html><head> <meta charset"utf-8" /> <meta name"viewport" content"widthdevice-width" /> <title>JS Bin</title> &…

解決Emmy Lua插件在IDEA或 Reder 沒有代碼提示的問題(設置文件關聯 增加對.lua.txt文件的支持)

目錄 Reder版本2019.x Reder版本2021.1.5x Reder版本2019.x 解決Emmy Lua插件在IDEA或 Reder 沒有代碼提示的問題(設置文件關聯 增加對.lua.txt文件的支持) Reder版本2021.1.5x 解決Emmy Lua插件在IDEA或 Reder 沒有代碼提示的問題(設置文件關聯 增加對.lua.txt文件的支持)…

java游戲制作-王者榮耀游戲

一.準備工作 首先創建一個新的Java項目命名為“王者榮耀”&#xff0c;并在src下創建兩個包分別命名為“com.sxt"、”com.stx.beast",在相應的包中創建所需的類。 創建一個名為“img”的文件夾來儲存所需的圖片素材。 二.代碼呈現 package com.sxt;import javax.sw…

Netty Review - 探索ByteBuf的內部機制

文章目錄 概念ByteBuf VS Java NIO BufferByteBuf實現類HeapByteBuf vs DirectByteBufPooledByteBuf vs UnpooledByteBuf其他 ByteBuf的實現機制 概念 ByteBuf是Netty中用于處理二進制數據的緩沖區 Netty的ByteBuf是一個可用于高效存儲和操作字節數據的數據結構。與傳統的Byt…

跳躍游戲[中等]

優質博文&#xff1a;IT-BLOG-CN 一、題目 給你一個非負整數數組nums&#xff0c;你最初位于數組的第一個下標 。數組中的每個元素代表你在該位置可以跳躍的最大長度。判斷你是否能夠到達最后一個下標&#xff0c;如果可以&#xff0c;返回true&#xff1b;否則&#xff0c;返…

阿里入局鴻蒙!鴻蒙原生應用再添兩員新丁

今日HarmonyOS微博稱&#xff0c;阿里釘釘、螞蟻集團旗下的移動開發平臺mPaaS與華為達成合作&#xff0c;宣布啟動鴻蒙原生應用的開發&#xff01;相關應用將以原生方式適配#HarmonyOS NEXT#系統。 #HarmonyOS#市場或迎來爆發式增長&#xff01; 阿里釘釘 阿里釘釘與華為達成合…

Android 匿名內存深入分析

Android 匿名內存解析 有了binder機制為什么還需要匿名內存來實現IPC呢&#xff1f;我覺得很大的原因就是binder傳輸是有大小限制的&#xff0c;不說應用層的限制。在驅動中binder的傳輸大小被限制在了4M&#xff0c;分享一張圖片可能就超過了這個限制。匿名內存的主要解決思路…

黑馬點評-10實現用戶點贊和點贊排行榜功能

用戶點贊功能 如果用戶只要點贊一次就對數據庫中blog表中的liked字段的值加1就會導致一個用戶無限點贊 PutMapping("/like/{id}") public Result likeBlog(PathVariable("id") Long id) {// 修改點贊數量,update tb_blog set liked liked 1 where id …

編譯器核心技術概覽

編譯技術是一門龐大的學科&#xff0c;我們無法對其做完善的講解。但不同用途的編譯器或編譯技術的難度可能相差很大&#xff0c;對知識的掌握要求也會相差很多。如果你要實現諸如 C、JavaScript 這類通用用途語言&#xff08;general purpose language&#xff09;&#xff0c…

buck降壓電路

一、Buck電路的拓撲結構 Buck是直流轉直流的降壓電路,下面是拓撲結構,作為硬件工程師,這個最好是能夠記下來,了然于胸。 為啥要記下來,自然是因為這個電路太基礎了,并且誰都會用到,更重要的一點,面試可能會考。。。 上圖是個異步buck,同步buck就是將里面的二極管換成M…

3D火山圖繪制教程

一邊學習&#xff0c;一邊總結&#xff0c;一邊分享&#xff01; 本期教程內容 **注&#xff1a;**本教程詳細內容 Volcano3D繪制3D火山圖 一、前言 火山圖是做差異分析中最常用到的圖形&#xff0c;在前面的推文中&#xff0c;我們也推出了好幾期火山圖的繪制教程&#xff0…

Android——資源IDnonFinalResIds和“Attribute value must be constant”錯誤

一、異常描述 通過資源ID引用資源提示錯誤 Attribute value must be constant 二、解決方案 在根目錄下的文件 gradle.properties 中添加如下配置&#xff0c;然后Sync Project android.nonFinalResIdsfalse 三、問題原因 android.nonFinalResIds 是Android開發中一個用于解…

此處不允許使用特性namespace

1.DOCTYPE 后面改成 mapper 2.PUBLIC一行中的Config改為Mapper 3.將下一行config變為小寫的mapper <?xml version"1.0" encoding"UTF-8" ?> <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.or…

交叉編譯安裝時報錯 ./install.sh: 15: ./install.sh: Bad substitution

報錯信息截圖如下&#xff1a; 解決方法 vim install.sh #!/bin/sh -e 修改為 !/bin/bash -e重新執行 sudo ./install.sh 成功運行

【Java并發】聊聊線程池原理以及實際應用

線程其實對于操作系統來說是寶貴的資源&#xff0c;java層面的線程其實本質還是依賴于操作系統內核的線程進行處理任務&#xff0c;如果頻繁的創建、使用、銷毀線程&#xff0c;那么勢必會非常浪費資源以及性能不高&#xff0c;所以池化技術&#xff08;數據庫連接池、線程池&a…

暢談Linux在小型微型企業中的應用

在這篇文章里我們討論和暢談一下linux系統在小微型企業中的應用&#xff0c;為什么會寫這篇文章呢&#xff1f;因為在平時的工作中&#xff0c;認識的一些做小微型企業的朋友&#xff0c;他們經常找我咨詢或是去解決一些平時工作中的IT相關的問題&#xff0c;那么小微型企業中的…