最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java集合框架之Map詳解

 更新時間:2022年03月03日 17:15:18   作者:二炮  
這篇文章主要為大家詳細介紹了Java集合框架之Map,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

1、Map的實現(xiàn)

  • HashMap
  • Hashtable
  • LinkedHashMap
  • TreeMap
  • ConcurrentHashMap

2、HashMap 和 Hashtable 的區(qū)別

  • HashMap:底層是基于數(shù)組+鏈表實現(xiàn),非線程安全的,默認容量是16、允許有空的健和值
  • Hashtable:基于哈希表實現(xiàn),線程安全的(加了synchronized鎖),默認容量是11,不允許有空的健和值

3、介紹下對象的 hashCode()和equals(),使用場景

hashCode:

頂級類Object里面的方法,所有的類都是繼承Object,返回是一個int類型的數(shù)

根據(jù)一定的hash規(guī)則(存儲地址,字段,長度等),映射成一個數(shù)值,即散列值

@Override
public int hashCode() {
     return Objects.hash(age,name,time);
}

equals:

頂級類Object里面的方法,所有的類都是繼承Object,返回是一個boolean類型

根據(jù)自定義的匹配規(guī)則,用于匹配兩個對象是否一樣,一般邏輯如下:

1、判斷地址是否一樣

2、非空判斷 和 Class類型判斷

3、強轉

4、對象里面的字段一一匹配

@Override
public boolean equals(Object obj) {
    if (obj == this)
        return true;
    if (obj == null || getClass() != obj.getClass())
        return false;
    User user = (User) obj;
    return age == user.age && Objects.equals(name, user.name) && Objects.equals(time, user.time);
}

使用場景:對象比較、或者集合容器里面排重、比較、排序

4、HashMap和TreeMap應該怎么選擇,使用場景

hashMap:

  • 散列桶(數(shù)組+鏈表),可以實現(xiàn)快速的存儲和檢索,但是確實包含無序的元素,適用于在map中插入刪除和定位元素

treeMap:

  • 使用存儲結構是一個平衡二叉樹->紅黑樹,可以自定義排序規(guī)則,要實現(xiàn)Comparator接口
  • 能便捷的實現(xiàn)內部元素的各種排序,但是一般性能比HashMap差,適用于安裝自然排序或者自定義排序規(guī)則 (寫過微信支付簽名工具類就用這個類)

5、Set和Map的關系 TODO

核心就是不保存重復的元素,存儲一組唯一的對象

set的每一種實現(xiàn)都是對應Map里面的一種封裝,

HashSet對應的就是HashMap,treeSet對應的就是treeMap

  • set:無序,不允許存在重復的元素
  • list:有序,可以存在重復元素
  • set 和 list 對比: 都是Collection的子接口,Collection是集合類;
  • set 檢查元素效率低下,刪除和插入的效率高,插入和刪除不會引起元素的位置變化;
  • list 和數(shù)組類似,List可以動態(tài)增長,查找元素的效率較高,插入元素和刪除元素效率低,因為會引起其他元素位置發(fā)生變化
  • map: Map接口不是Collection接口的繼承,而是從自己的用于維護鍵值對關聯(lián)的接口層次結構入手,按定義,該接口描述了從不重復的鍵到值的映射

6、常見Map的排序規(guī)則是怎樣的?

按照添加順序使用LinkedHashMap,按照自然排序使用TreeMap,自定義排序 TreeMap(Comparetor c)

7、如果需要線程安全,且效率高的Map,應該怎么做?

  • 多線程環(huán)境下可以用concurrent包下的ConcurrentHashMap,或者使用Collections.synchronizedMap(),
  • ConcurrentHashMap雖然是線程安全,但是他的效率比Hashtable要高很多使用
  • Collections.synchronizedMap包裝后返回的map是加鎖的

8、介紹下 HashMap

  • HashMap底層(數(shù)組+鏈表+紅黑樹 jdk8才有紅黑樹),在JDK1.8中,鏈表的長度大于8,鏈表會轉換成紅黑樹
  • 數(shù)組中每一項是一個鏈表,即數(shù)組和鏈表的結合體
  • Node<K,V>[] table

是數(shù)組,數(shù)組的元素是Entry(Node繼承Entry),Entry元素是一個key-value的鍵值對,它持有一個指向下個Entry的引用,table數(shù)組的每個Entry元素同時也作為當前Entry鏈表的首節(jié)點,也指向了該鏈表的下個Entry元素

數(shù)組的一個小格代表一個bucket

9、什么是Hash碰撞?常見的解決辦法有哪些,hashmap采用哪種方法?

  • hash碰撞的意思是不同key計算得到的Hash值相同,需要放到同個bucket中
  • 常見的解決辦法:鏈表法、開發(fā)地址法、再哈希法等
  • HashMap采用的是鏈表法

10、HashMap底層是 數(shù)組+鏈表+紅黑樹,為什么要用這幾類結構呢?

  • 數(shù)組:Node<K,V>[] table ,根據(jù)對象的key的hash值確定在數(shù)組里面是哪個節(jié)點 - 鏈表:作用是解決hash沖突,將hash值一樣的對象存在一個鏈表放在hash值對應的槽位
  • 紅黑樹:JDK8使用紅黑樹來替代超過8個節(jié)點的鏈表,主要是查詢性能的提升,從原來的O(n)到O(logn),
  • 通過hash碰撞,讓HashMap不斷產生碰撞,那么相同key的位置的鏈表就會不斷增長,
  • 當對這個Hashmap的相應位置進行查詢的時候,就會循環(huán)遍歷這個超級大的鏈表,性能就會下降,所以改用紅黑樹

11、為什么選擇紅黑樹而不用其他樹,比如二叉查找樹,為什么不一直開始就用紅黑樹,而是到8的長度后才變換

  • 二叉查找樹在特殊情況下也會變成一條線性結構,和原先的鏈表存在一樣的深度遍歷問題,查找性能就會慢,
  • 使用紅黑樹主要是提升查找數(shù)據(jù)的速度,紅黑樹是平衡二叉樹的一種,插入新數(shù)據(jù)后會通過左旋,右旋、變色等操作來保持平衡,解決單鏈表查詢深度的問題
  • 數(shù)據(jù)量少的時候操作數(shù)據(jù),遍歷線性表比紅黑樹所消耗的資源少,且前期數(shù)據(jù)少平衡二叉樹保持平衡是需要消耗資源的,所以前期采用線性表,等到一定數(shù)之后變換到紅黑樹

12、了解ConcurrentHashMap嗎?為什么性能比hashtable高,說下原理

  • ConcurrentHashMap是線程安全的Map,因為hashtable類基本上所有的方法都是采用synchronized進行線程安全控制,高并發(fā)情況下效率就降低
  • ConcurrentHashMap是采用了分段鎖的思想提高性能,鎖粒度更細化

13、jdk1.7和jdk1.8里面ConcurrentHashMap實現(xiàn)的區(qū)別有沒了解

  • JDK8之前,ConcurrentHashMap使用鎖分段技術,將數(shù)據(jù)分成一段段存儲,每個數(shù)據(jù)段配置一把鎖,即segment類,這個類繼承ReentrantLock來保證線程安全 【技術點:Segment + HashEntry】
  • JKD8的版本取消Segment這個分段鎖數(shù)據(jù)結構,底層也是使用Node數(shù)組+鏈表+紅黑樹,從而實現(xiàn)對每一段數(shù)據(jù)就行加鎖,也減少了并發(fā)沖突的概率,CAS(讀)+Synchronized(寫)【技術點:Node + Cas + Synchronized】

總結

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注腳本之家的更多內容!   

相關文章

  • Java查看變量的數(shù)據(jù)類型的三種方法

    Java查看變量的數(shù)據(jù)類型的三種方法

    Java是一門強類型的編程語言,它對變量的數(shù)據(jù)類型有嚴格的限定,在定義變量時必須聲明變量的數(shù)據(jù)類型,在為變量賦值時必須賦予與變量同一種類型的值,否則程序會報錯, 所以本文給大家介紹了Java查看變量的數(shù)據(jù)類型的三種方法,需要的朋友可以參考下
    2024-10-10
  • idea SpringBoot+Gradle環(huán)境配置到項目打包

    idea SpringBoot+Gradle環(huán)境配置到項目打包

    Gradle是一個基于Java應用的項目自動化構建工具,本文介紹了在IDEA中創(chuàng)建Spring Boot Gradle項目,項目配置包括init.gradle和settings.gradle,感興趣的可以了解一下
    2024-11-11
  • SpringBoot 中實現(xiàn)跨域的5種方式小結

    SpringBoot 中實現(xiàn)跨域的5種方式小結

    這篇文章主要介紹了SpringBoot 中實現(xiàn)跨域的5種方式小結,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-02-02
  • springboot整合日志處理Logback的實現(xiàn)示例

    springboot整合日志處理Logback的實現(xiàn)示例

    Logback是由log4j創(chuàng)始人設計的又一個開源日志組件,本文主要介紹了springboot整合日志處理Logback,文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學習學習吧
    2024-01-01
  • 詳解Java比較器

    詳解Java比較器

    這篇文章主要介紹了Java比較器的相關資料,文中講解非常細致,代碼幫助大家更好的理解和學習,感興趣的朋友可以了解下
    2020-07-07
  • Java基礎之容器Vector詳解

    Java基礎之容器Vector詳解

    這篇文章主要介紹了Java基礎之容器Vector詳解,文中有非常詳細的代碼示例,對正在學習java的小伙伴們有很好的幫助,需要的朋友可以參考下
    2021-04-04
  • SpringBoot兩種方式接入DeepSeek的實現(xiàn)

    SpringBoot兩種方式接入DeepSeek的實現(xiàn)

    本文主要介紹了SpringBoot兩種方式接入DeepSeek的實現(xiàn),包括HttpClient方式和基于spring-ai-openai的方式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-03-03
  • Java實現(xiàn)跳轉到指定頁面的方法小結

    Java實現(xiàn)跳轉到指定頁面的方法小結

    在Java中,實現(xiàn)頁面跳轉主要涉及到Web開發(fā),而這通常通過使用Java的Web框架(如Servlet、Spring MVC)來完成,下面講解一下如何在不同的Java Web框架中實現(xiàn)頁面跳轉,文中有詳細的代碼示例供大家參考,需要的朋友可以參考下
    2024-05-05
  • 深入解析面向對象編程在Java中的應用小結

    深入解析面向對象編程在Java中的應用小結

    本文詳細介紹了面向對象編程的基本概念,包括類和對象、封裝、繼承和多態(tài),通過具體的Java代碼示例,展示了如何在Java中應用這些面向對象編程的核心思想,感興趣的朋友跟隨小編一起看看吧
    2025-01-01
  • Java正則表達式判斷字符串中是否包含中文示例

    Java正則表達式判斷字符串中是否包含中文示例

    之前一個朋友問我,如何判斷字符串中是否包含中文,其實解決的方法很簡單,但覺著有必要寫出給不知道的朋友們以參考,所以下面這篇文章主要介紹了利用Java正則表達式判斷字符串中是否包含中文的方法,需要的朋友可以參考。
    2017-03-03

最新評論

沁阳市| 分宜县| 信宜市| 凌源市| 徐汇区| 武定县| 维西| 白河县| 湘乡市| 乐至县| 运城市| 琼结县| 通州市| 凌源市| 海林市| 武定县| 和顺县| 玉环县| 土默特左旗| 县级市| 乐山市| 顺昌县| 建始县| 什邡市| 北碚区| 凤庆县| 霸州市| 泊头市| 滨海县| 文安县| 湖南省| 吉隆县| 当涂县| 高平市| 平顶山市| SHOW| 延津县| 瓦房店市| 建湖县| 边坝县| 马尔康县|