欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

HashMap類

1、HashMap類概述

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

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

一個key-value構成一個entry,所有的entry構成的集合是Set:無序的、不可重復的。

HashMap判斷兩個 key 相等的標準:兩個 key 通過 equals() 方法返回 true,
hashCode() 值也相等。
HashMap判斷兩個 value 相等的標準:兩個 value 通過 equals() 方法返回 true。

2、HashMap的存儲結構(底層實現(xiàn)原理)

HashMap map = new HashMap()

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

map.put(key1,value1)

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

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

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

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

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

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

在這里插入圖片描述

在這里插入圖片描述

3、HashMap源碼中的重要常量

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

LinkedHashMap類

LinkedHashMap 是 HashMap 的子類

在HashMap存儲結構的基礎上,使用了一對雙向鏈表來記錄添加元素的順序

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

在這里插入圖片描述

TreeMap類

1、TreeMap類概述

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

TreeSet底層使用紅黑樹結構存儲數(shù)據(jù)。

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

TreeMap判斷兩個key相等的標準:兩個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());
        }
    }
}

在這里插入圖片描述

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是個古老的 Map 實現(xiàn)類,JDK1.0就提供了。不同于HashMap,
Hashtable是線程安全的。

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

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

Hashtable判斷兩個key相等、兩個value相等的標準,與HashMap一致。

Properties類

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

存取數(shù)據(jù)時,建議使用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接口的實現(xiàn)類精解的文章就介紹到這了,更多相關Java Map內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • spring cloud 集成 ribbon負載均衡的實例代碼

    spring cloud 集成 ribbon負載均衡的實例代碼

    spring Cloud Ribbon 是一個客戶端的負載均衡器,它提供對大量的HTTP和TCP客戶端的訪問控制。本文給大家介紹spring cloud 集成 ribbon負載均衡,感興趣的朋友跟隨小編一起看看吧
    2021-11-11
  • Java 知識難點之異常的認知與使用詳解

    Java 知識難點之異常的認知與使用詳解

    所謂異常是指程序在運行時出現(xiàn)錯誤時提示調(diào)用者的機制,異常的種類有很多,不同種類的異常有不同的含義,也有不同的處理方式,通讀本篇對大家的學習或工作具有一定的價值,需要的朋友可以參考下
    2021-09-09
  • Mybatis-Plus saveBatch()批量保存失效的解決

    Mybatis-Plus saveBatch()批量保存失效的解決

    本文主要介紹了Mybatis-Plus saveBatch()批量保存失效的解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-01-01
  • springboot連接多個數(shù)據(jù)庫的實現(xiàn)方法

    springboot連接多個數(shù)據(jù)庫的實現(xiàn)方法

    有時候一個SpringBoot項目需要同時連接兩個數(shù)據(jù)庫,本文就來介紹一下springboot連接多個數(shù)據(jù)庫的實現(xiàn)方法,具有一定的參考價值,感興趣的可以了解一下
    2024-08-08
  • RabbitMQ消費者限流實現(xiàn)消息處理優(yōu)化

    RabbitMQ消費者限流實現(xiàn)消息處理優(yōu)化

    這篇文章主要介紹了RabbitMQ消費者限流實現(xiàn)消息處理優(yōu)化,消費者限流是用于消費者每次獲取消息時限制條數(shù),注意前提是手動確認模式,并且在手動確認后才能獲取到消息,感興趣想要詳細了解可以參考下文
    2023-05-05
  • Java填充替換數(shù)組元素實例詳解

    Java填充替換數(shù)組元素實例詳解

    這篇文章主要通過兩個實例說明Java填充和替換數(shù)組中元素的方法,需要的朋友可以參考下。
    2017-08-08
  • Spring Boot Filter 過濾器的使用方式

    Spring Boot Filter 過濾器的使用方式

    這篇文章主要介紹了Spring Boot Filter 過濾器的使用方式,文章通過圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-09-09
  • IntelliJ IDEA優(yōu)化配置的實現(xiàn)

    IntelliJ IDEA優(yōu)化配置的實現(xiàn)

    這篇文章主要介紹了IntelliJ IDEA優(yōu)化配置的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-07-07
  • Java數(shù)據(jù)結構常見幾大排序梳理

    Java數(shù)據(jù)結構常見幾大排序梳理

    Java常見的排序算法有:直接插入排序、希爾排序、選擇排序、冒泡排序、歸并排序、快速排序、堆排序等。本文詳解介紹它們的實現(xiàn)以及圖解,需要的可以參考一下
    2022-03-03
  • Java前后端分離項目跨域問題解決方案

    Java前后端分離項目跨域問題解決方案

    本文主要介紹了Java前后端分離項目跨域問題解決方案,其中后端基于SpringBoot,前端使用了jQuery、axios等框架,具有一定的參考價值,感興趣的可以了解一下
    2024-03-03

最新評論