溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Java集合中Map接口的實(shí)現(xiàn)類有哪些

發(fā)布時(shí)間:2021-09-29 10:50:19 來源:億速云 閱讀:191 作者:小新 欄目:開發(fā)技術(shù)

這篇文章主要為大家展示了“Java集合中Map接口的實(shí)現(xiàn)類有哪些”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“Java集合中Map接口的實(shí)現(xiàn)類有哪些”這篇文章吧。

    HashMap類

    1、HashMap類概述

    HashMap是 Map 接口使用頻率最高的實(shí)現(xiàn)類,允許使用null鍵和null值,與HashSet一樣,不保證映射的順序。

    所有的key構(gòu)成的集合是Set:無序的、不可重復(fù)的。所以,key所在的類要重寫
    equals()hashCode()
    所有的value構(gòu)成的集合是Collection:無序的、可重復(fù)的。所以,value所在的類
    要重寫equals()

    一個(gè)key-value構(gòu)成一個(gè)entry,所有的entry構(gòu)成的集合是Set:無序的、不可重復(fù)的。

    HashMap判斷兩個(gè) key 相等的標(biāo)準(zhǔn):兩個(gè) key 通過 equals() 方法返回 true,
    hashCode() 值也相等。
    HashMap判斷兩個(gè) value 相等的標(biāo)準(zhǔn):兩個(gè) value 通過 equals() 方法返回 true。

    2、HashMap的存儲(chǔ)結(jié)構(gòu)(底層實(shí)現(xiàn)原理)

    HashMap map = new HashMap()

    (以JDK1.7說明)
    在實(shí)例化以后,底層就創(chuàng)建了長(zhǎng)度為16的一維數(shù)組Entry[] table

    map.put(key1,value1)

    首先,調(diào)用key1所在類的hashCode()計(jì)算key1哈希值,此哈希值經(jīng)過某種算法計(jì)算以后,得到在Entry[]數(shù)組中的存放位置。

    如果此位置上的數(shù)據(jù)為空,此時(shí)的key1-value1添加成功。----情況1
    如果此位置上的數(shù)據(jù)不為空(意味著此位置上存在一個(gè)或多個(gè)數(shù)據(jù)(以鏈表形式存在)),則繼續(xù)比較key1和已經(jīng)存在的一個(gè)或多個(gè)數(shù)據(jù)的哈希值:

    如果key1的哈希值與已經(jīng)存在的數(shù)據(jù)的哈希值都不相同,此時(shí)key1-value1添加成功。----情況2
    如果key1的哈希值和已經(jīng)存在的某一個(gè)數(shù)據(jù)key2-value2的哈希值相同,繼續(xù)比較:

    調(diào)用key1所在類的equals(key2)
    如果equals()返回false:此時(shí)key1-value1添加成功。----情況3
    如果equals()返回true:使用value1替換value2。

    補(bǔ)充:關(guān)于情況2和情況3,此時(shí)key1-value1和原來的數(shù)據(jù)以鏈表的方式存儲(chǔ)。
    在不斷的添加過程中,會(huì)涉及到擴(kuò)容問題,默認(rèn)的擴(kuò)容方式:擴(kuò)容為原來容量的2倍,并將原有的數(shù)據(jù)復(fù)制過來。

    JDK1.8相較于JDK1.7在底層實(shí)現(xiàn)方面的不同:
    new HashMap(),底層還沒有創(chuàng)建一個(gè)長(zhǎng)度為16的數(shù)組
    ②JDK1.8底層的數(shù)組是: Node[],而非Entry[]
    ③首次調(diào)用put()方法時(shí),底層才創(chuàng)建長(zhǎng)度為16的數(shù)組Node[]
    ④形成鏈表結(jié)構(gòu)時(shí),新添加的key-value對(duì)在鏈表的尾部(七上八下)
    ⑤JDK1.7底層結(jié)構(gòu)只有“數(shù)組+鏈表”,JDK1.8中底層結(jié)構(gòu)為“數(shù)組+鏈表+紅黑樹”。
    當(dāng)數(shù)組的某一個(gè)索引位置上的元素以鏈表形式存在的數(shù)據(jù)個(gè)數(shù)>8且當(dāng)前數(shù)組的長(zhǎng)度>64時(shí),此時(shí)此索引位置上的所有數(shù)據(jù)改為使用紅黑樹存儲(chǔ)。

    Java集合中Map接口的實(shí)現(xiàn)類有哪些

    Java集合中Map接口的實(shí)現(xiàn)類有哪些

    3、HashMap源碼中的重要常量

    DEFAULT_INITIAL_CAPACITY: HashMap的默認(rèn)容量,16
    MAXIMUM_CAPACITY: HashMap的最大支持容量,2^30
    DEFAULT_LOAD_FACTOR:HashMap的默認(rèn)加載因子,0.75
    TREEIFY_THRESHOLD:Bucket中鏈表長(zhǎng)度大于該默認(rèn)值8,轉(zhuǎn)化為紅黑樹
    UNTREEIFY_THRESHOLD:Bucket中紅黑樹存儲(chǔ)的Node小于該默認(rèn)值6,轉(zhuǎn)化為鏈表
    MIN_TREEIFY_CAPACITY:桶中的Node被樹化時(shí)最小的hash表容量。(當(dāng)桶中Node的數(shù)量大到需要變紅黑樹時(shí),若hash表容量小于MIN_TREEIFY_CAPACITY時(shí),此時(shí)應(yīng)執(zhí)行resize擴(kuò)容操作這個(gè)MIN_TREEIFY_CAPACITY的值至少是TREEIFY_THRESHOLD的4倍為64。)
    table:存儲(chǔ)元素的數(shù)組,總是2的n次冪
    entrySet:存儲(chǔ)具體元素的集
    size:HashMap中存儲(chǔ)的鍵值對(duì)的數(shù)量
    modCount:HashMap擴(kuò)容和結(jié)構(gòu)改變的次數(shù)。
    threshold:擴(kuò)容的臨界值,=容量*填充因子
    loadFactor:填充因子

    LinkedHashMap類

    LinkedHashMap 是 HashMap 的子類

    在HashMap存儲(chǔ)結(jié)構(gòu)的基礎(chǔ)上,使用了一對(duì)雙向鏈表來記錄添加元素的順序

    與LinkedHashSet類似,LinkedHashMap 可以維護(hù) Map 的迭代順序:迭代順序與 Key-Value 對(duì)的插入順序一致

    Java集合中Map接口的實(shí)現(xiàn)類有哪些

    TreeMap類

    1、TreeMap類概述

    TreeMap存儲(chǔ) Key-Value 對(duì)時(shí),需要根據(jù) key 進(jìn)行排序。TreeMap 可以保證所有的 Key-Value 處于有序狀態(tài)。

    TreeSet底層使用紅黑樹結(jié)構(gòu)存儲(chǔ)數(shù)據(jù)。

    TreeMap 的 Key 的排序:
    ①自然排序:TreeMap 的所有的 Key 必須實(shí)現(xiàn) Comparable 接口,而且所有
    的 Key 應(yīng)該是同一個(gè)類的對(duì)象,否則將會(huì)拋出 ClasssCastException。
    ②定制排序:創(chuàng)建 TreeMap 時(shí),傳入一個(gè) Comparator 對(duì)象,該對(duì)象負(fù)責(zé)對(duì)
    TreeMap 中的所有 key 進(jìn)行排序,此時(shí)不需要 Map的Key實(shí)現(xiàn)Comparable接口。

    TreeMap判斷兩個(gè)key相等的標(biāo)準(zhǔn):兩個(gè)key通過compareTo()方法或者compare()方法返回0。

    2、自然排序

    import java.util.Iterator;
    import java.util.Map;
    import java.util.Set;
    import java.util.TreeMap;
    
    /**
     * @Author: Yeman
     * @Date: 2021-09-22-22:59
     * @Description:
     */
    
    class user implements Comparable{
        String name;
        int age;
    
        public user(String name, int age) {
            this.name = name;
            this.age = age;
        }
    
        @Override
        public String toString() {
            return "user{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    '}';
        }
    
        @Override
        public int compareTo(Object o) {
            if (o instanceof user){
                user other = (user) o;
                Integer nameResult = this.name.compareTo(other.name);
                if (nameResult == 0){
                    return Integer.compare(this.age,other.age);
                }else return nameResult;
            }else throw new RuntimeException("類型不匹配");
        }
    }
    
    
    public class TreeMapTest {
        public static void main(String[] args) {
            Map map = new TreeMap();
            map.put(new user("Tom",22),1);
            map.put(new user("Jim",18),2);
            map.put(new user("Marry",20),3);
            map.put(new user("Lily",16),4);
            map.put(new user("Tom",18),5);
    
            Set set = map.entrySet();
            Iterator iterator = set.iterator();
            while (iterator.hasNext()){
                System.out.println(iterator.next());
            }
        }
    }

    Java集合中Map接口的實(shí)現(xiàn)類有哪些

    3、定制排序

    import java.util.*;
    
    /**
     * @Author: Yeman
     * @Date: 2021-09-22-22:59
     * @Description:
     */
    
    class user {
        String name;
        int age;
    
        public user(String name, int age) {
            this.name = name;
            this.age = age;
        }
    
        @Override
        public String toString() {
            return "user{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    '}';
        }
    }
    
    public class TreeMapTest {
        public static void main(String[] args) {
            Comparator comparator = new Comparator() {
                @Override
                public int compare(Object o1, Object o2) {
                    if (o1 instanceof user && o2 instanceof user) {
                        user user1 = (user) o1;
                        user user2 = (user) o2;
                        Integer nameResult = user1.name.compareTo(user2.name);
                        if (nameResult == 0) return Integer.compare(user1.age, user2.age);
                        else return nameResult;
                    } else throw new RuntimeException("類型不匹配");
                }
            };
    
            Map map = new TreeMap(comparator);
            map.put(new user("Tom",22),1);
            map.put(new user("Jim",18),2);
            map.put(new user("Marry",20),3);
            map.put(new user("Lily",16),4);
            map.put(new user("Tom",18),5);
    
            Set set = map.entrySet();
            Iterator iterator = set.iterator();
            while (iterator.hasNext()) {
                System.out.println(iterator.next());
            }
        }
    }

    Java集合中Map接口的實(shí)現(xiàn)類有哪些

    Hashtable類

    Hashtable是個(gè)古老的 Map 實(shí)現(xiàn)類,JDK1.0就提供了。不同于HashMap,
    Hashtable是線程安全的。

    Hashtable實(shí)現(xiàn)原理和HashMap相同,功能相同。底層都使用哈希表結(jié)構(gòu),查詢
    速度快,很多情況下可以互用。

    與HashMap不同,Hashtable 不允許使用 null 作為 key 和 value。
    與HashMap一樣,Hashtable 也不能保證其中 Key-Value 對(duì)的順序。

    Hashtable判斷兩個(gè)key相等、兩個(gè)value相等的標(biāo)準(zhǔn),與HashMap一致。

    Properties類

    Properties 類是 Hashtable 的子類,該對(duì)象用于處理屬性文件,由于屬性文件里的 key、value 都是字符串類型,所以 Properties 里的 key 和 value 都是字符串類型

    存取數(shù)據(jù)時(shí),建議使用setProperty(String key,String value)方法和getProperty(String key)方法

    Properties pros = new Properties();
    pros.load(new FileInputStream("jdbc.properties"));
    String user = pros.getProperty("user");
    System.out.println(user);

    以上是“Java集合中Map接口的實(shí)現(xiàn)類有哪些”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI