關於集合框架Map,你所不知道的知識!

前言

相信不少同窗都瞭解集合框架Map。但很多同窗對Map的瞭解僅僅限於HashMap,那不妨看看個人這篇文章,或許你會有所收穫!java

經常使用Map有哪些

答:HashMap、Hashtable、LinkedHashMap、TreeMap、ConcurrentHashMap數組

對比HashMap和Hashtable 的區別

答: HashMap:底層是基於數組+鏈表實現,屬於非線程安全,默認容量是16,容許有空的健和值。安全

Hashtable:底層是基於哈希表實現,屬於線程安全(加了synchronized),默認容量是11,不容許有null的健和值。多線程

hashCode()和equals()的含義與使用場景

答: hashcode():頂級類Object裏面的方法,全部的類都是繼承Object,返回是一個int類型的數。根據必定的hash規則(存儲地址,字段,長度等),映射成一個數組,即散列值。併發

equals() :頂級類Object裏面的方法,全部的類都是繼承Object,返回是一個boolean類型。根據自定義的匹配規則,用於匹配兩個對象是否同樣,通常邏輯以下:1.判斷地址是否同樣、2.非空判斷和Class類型判斷、3.強轉、4.對象裏面的字段一一匹配。 代碼實戰以下:框架

import java.util.Date;
import java.util.Objects;

public class User {

    private int age;

    private  String name;

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public int hashCode() {

        return Objects.hash(age,name);

    }

    @Override
    public boolean equals(Object obj) {

        if(this == obj) return true;

        if(obj == null || getClass() != obj.getClass()) return false;

        User user = (User) obj;

        return age == user.age && Objects.equals(name, user.name) ;

    }
}

複製代碼

實際應用中如何選擇HashMap和TreeMap

答: hashMap: 使用散列桶實現(即數組+鏈表結構),能夠實現快速的存儲和檢索,可是包含無序的元素,適用於在map中插入、刪除和定位元素。 ​ treeMap:使用存儲結構是一個平衡二叉樹,具體實現是紅黑樹,能夠自定義排序規則,要實現Comparator接口,能便捷的實現內部元素的各類排序,可是通常性能比HashMap差,適用於自定義排序規則。ide

解析Set和Map的關係

答:set的核心就是集合中元素不可重複,存儲一組惟一的對象。 set中的每一種實現都是對應Map裏面的一種封裝,HashSet對應的就是HashMap,TreeSet對應的就是TreeMap。高併發

常見Map的排序規則是怎樣的

答:按照添加順序排序使用LinkedHashMap,按照天然排序與自定義排序用TreeMap。源碼分析

線程安全且效率高的Map是哪一個

答:多線程環境下能夠用concurrent包下的ConcurrentHashMap或者使用Collections.synchronizedMap。ConcurrentHashMap雖然是線程安全,可是他的效率比Hashtable要高不少.性能

爲何Collections.synchronizedMap是線程安全的

答:使用Collections.synchronizedMap包裝後返回的map是加鎖的。

從源碼分析HashMap

答:HashMap底層是數組+鏈表+紅黑樹實現(jdk8纔有紅黑樹)。數組中的每一項都是一個鏈表,即數組與鏈表的結合體。在JDK1.8中,鏈表的長度大於8,鏈表會轉換成紅黑樹。

Entry元素是一個key-value的鍵值對,它持有一個指向下個Entry的引用,每一個Entry元素同時也做爲當前Entry鏈表的首節點,也指向了該鏈表的下個Entry元素。

在這裏插入圖片描述

Hash碰撞

答:Hash碰撞是指不一樣key計算獲得的Hash值相同,須要放到同個bucket中。

鏈表的長度大於8以後爲何會轉換成紅黑樹

答:由於數據量少的時候操做數據,遍歷線性表比紅黑樹所消耗的資源少,因此前期採用線性表,等到必定數以後變換到紅黑樹。

爲何ConcurrentHashMap性能比hashtable高

答:ConcurrentHashMap是線程安全的Map, Hashtable類基本上全部的方法都是採用synchronized進行線程安全控制,高併發狀況下效率就會降。而ConcurrentHashMap是採用了分段鎖的思想提升性能,鎖粒度更細化。

結語

歡迎你們糾正與補充!

相關文章
相關標籤/搜索