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

Java集合之Map接口的實(shí)現(xiàn)類精解

 更新時(shí)間:2021年09月29日 09:57:06   作者:葉綠體不忘呼吸  
Map提供了一種映射關(guān)系,其中的元素是以鍵值對(duì)(key-value)的形式存儲(chǔ)的,能夠?qū)崿F(xiàn)根據(jù)key快速查找value;Map中的鍵值對(duì)以Entry類型的對(duì)象實(shí)例形式存在;鍵(key值)不可重復(fù),value值可以重復(fù),一個(gè)value值可以和很多key值形成對(duì)應(yīng)關(guān)系,每個(gè)建最多只能映射到一個(gè)值

HashMap類

1、HashMap類概述

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

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

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

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

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

HashMap map = new HashMap()

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

map.put(key1,value1)

首先,調(diào)用key1所在類的hashCode()計(jì)算key1哈希值,此哈希值經(jīng)過(guò)某種算法計(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和原來(lái)的數(shù)據(jù)以鏈表的方式存儲(chǔ)。
在不斷的添加過(guò)程中,會(huì)涉及到擴(kuò)容問(wèn)題,默認(rèn)的擴(kuò)容方式:擴(kuò)容為原來(lái)容量的2倍,并將原有的數(shù)據(jù)復(fù)制過(guò)來(lái)。

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ǔ)。

在這里插入圖片描述

在這里插入圖片描述

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ì)雙向鏈表來(lái)記錄添加元素的順序

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

在這里插入圖片描述

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通過(guò)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());
        }
    }
}

在這里插入圖片描述

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());
        }
    }
}

在這里插入圖片描述

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);

到此這篇關(guān)于Java集合之Map接口的實(shí)現(xiàn)類精解的文章就介紹到這了,更多相關(guān)Java Map內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java線程操作的常見方法【線程名稱獲取、設(shè)置、線程啟動(dòng)判斷等】

    Java線程操作的常見方法【線程名稱獲取、設(shè)置、線程啟動(dòng)判斷等】

    這篇文章主要介紹了Java線程操作的常見方法,結(jié)合實(shí)例形式總結(jié)分析了java線程的創(chuàng)建、線程名稱的獲取、設(shè)置以及線程啟動(dòng)的判斷等相關(guān)操作實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2019-10-10
  • Spring Cloud 2023 新特性支持同步網(wǎng)關(guān)

    Spring Cloud 2023 新特性支持同步網(wǎng)關(guān)

    這篇文章主要為大家介紹了Spring Cloud 2023 新特性支持同步網(wǎng)關(guān)講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • Java設(shè)計(jì)模式中的單例模式解析

    Java設(shè)計(jì)模式中的單例模式解析

    這篇文章主要介紹了Java設(shè)計(jì)模式中的單例模式解析,單例模式確保一個(gè)類只有一個(gè)實(shí)例,而且自行實(shí)例化并向整個(gè)系統(tǒng)提供這個(gè)實(shí)例,需要的朋友可以參考下
    2023-11-11
  • spring-cloud入門之spring-cloud-config(配置中心)

    spring-cloud入門之spring-cloud-config(配置中心)

    這篇文章主要介紹了spring-cloud入門之spring-cloud-config(配置中心),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-01-01
  • hadoop 單機(jī)安裝配置教程

    hadoop 單機(jī)安裝配置教程

    單機(jī)安裝主要用于程序邏輯調(diào)試。安裝步驟基本通分布式安裝,包括環(huán)境變量,主要Hadoop配置文件,SSH配置等,需要的朋友可以參考下
    2012-11-11
  • java編譯器的基礎(chǔ)知識(shí)點(diǎn)

    java編譯器的基礎(chǔ)知識(shí)點(diǎn)

    在本篇文章里小編給大家整理的是一篇關(guān)于java編譯器的基礎(chǔ)知識(shí)點(diǎn)內(nèi)容,有興趣的朋友們可以閱讀下。
    2020-02-02
  • SpringBoot+SpringSession+Redis實(shí)現(xiàn)session共享及唯一登錄示例

    SpringBoot+SpringSession+Redis實(shí)現(xiàn)session共享及唯一登錄示例

    這篇文章主要介紹了SpringBoot+SpringSession+Redis實(shí)現(xiàn)session共享及唯一登錄示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • Java線程優(yōu)先級(jí)和守護(hù)線程原理解析

    Java線程優(yōu)先級(jí)和守護(hù)線程原理解析

    這篇文章主要介紹了Java線程優(yōu)先級(jí)和守護(hù)線程原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • 詳解java連接mysql數(shù)據(jù)庫(kù)的五種方式

    詳解java連接mysql數(shù)據(jù)庫(kù)的五種方式

    這篇文章主要介紹了詳解java連接mysql數(shù)據(jù)庫(kù)的五種方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • JAVA多線程的使用場(chǎng)景與注意事項(xiàng)總結(jié)

    JAVA多線程的使用場(chǎng)景與注意事項(xiàng)總結(jié)

    這篇文章主要給大家介紹了關(guān)于JAVA多線程的使用場(chǎng)景與注意事項(xiàng)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03

最新評(píng)論

望谟县| 开化县| 宜都市| 和硕县| 获嘉县| 吉林省| 阳春市| 元阳县| 九江县| 兴宁市| 青浦区| 建湖县| 邛崃市| 南丹县| 工布江达县| 林州市| 太康县| 普安县| 攀枝花市| 大荔县| 闻喜县| 平罗县| 黑山县| 保德县| 清水河县| 深水埗区| 瑞丽市| 工布江达县| 和林格尔县| 伊春市| 额敏县| 虞城县| 大城县| 泾川县| 始兴县| 江安县| 宁远县| 正定县| 阆中市| 洞头县| 韶山市|