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

深入淺出講解Java集合之Map接口

 更新時間:2021年09月13日 14:54:40   作者:威斯布魯克.猩猩  
這篇文章主要介紹了深入淺出講解Java集合之Map接口,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

一、Map接口繼承樹

Map:雙列數(shù)據(jù),存儲key-value對的數(shù)據(jù) ---類似于高中的函數(shù):y = f(x)
A.HashMap:作為Map的主要實現(xiàn)類;線程不安全的,效率高;存儲null的key和value
a.LinkedHashMap:保證在遍歷map元素時,可以按照添加的順序?qū)崿F(xiàn)遍歷。
原因:在原有的HashMap底層結(jié)構(gòu)基礎(chǔ)上,添加了一對指針,指向前一個和后一個元素。
對于頻繁的遍歷操作,此類執(zhí)行效率高于HashMap.
B.TreeMap:保證按照添加的key-value對進行排序,實現(xiàn)排序遍歷。此時考慮key的自然排序或定制排序
底層使用紅黑樹
C.Hashtable:作為古老的實現(xiàn)類:線程安全的,效率低;不能存儲null的key和value
c.Properties:常用來處理配置文件。key和value都是String類型

HashMap的底層:數(shù)組 + 鏈表(JDK及之前)
數(shù)組 + 鏈表 + 紅黑樹(jdk 8)

Map結(jié)構(gòu)的理解:
> Map中的key:無序的、不可重復的,使用Set存儲所有的key --->key所在的類要重寫equals()和hashCode()(以HashMap為例)
> Map中的value:無序的、可重復的,使用Collection存儲所有的value --->value所在的類型要重寫equals()
> 一個鍵值對:key-value構(gòu)成了一個Entry對象。
> Map中的entry:無序的、不可重復的,使用Set存儲所有的entry

二、Map接口中的常用方法

/*
    添加、刪除、修改操作:
    Object put(Object key,Object value): 將指定key-value添加到(或修改)當前map對象中
    void putAll(Map m):將m中的所有key-value對存放到當前map中
    Object remove(Object key):移除指定key的key-value對,并返回value
    void clear():清空當前map中的所有數(shù)據(jù)
     */
    public void test1(){
        HashMap map = new HashMap();
        //添加
        map.put("AA",123);
        map.put(45,123);
        map.put("BB",56);
        //修改
        map.put("AA",87);
        System.out.println(map);//{AA=87, BB=56, 45=123}
        HashMap map1 = new HashMap();
        map.put("CC",123);
        map.put("DD",123);
        map.putAll(map1);
        System.out.println(map);//{AA=87, BB=56, CC=123, DD=123, 45=123}
        //remove(Object key)
        Object value = map.remove("CC");
        System.out.println(value);//123
        System.out.println(map);//{AA=87, BB=56, DD=123, 45=123}
        //clear()
        map.clear();//與map = null操作不同;map對象還在,只是里面的數(shù)據(jù)沒了
        System.out.println(map.size());//0
        System.out.println(map);//{}
    }
 /*
    元素查詢的操作:
    Object get(Object key):獲取指定key對應的value
    boolean containsKey(Object key):是否包含指定的value
    int size():返回map中key-value對的個數(shù)
    boolean isEmpty():判斷當前map是否為空
    boolean equals(Object obj):判斷當前map和參數(shù)對象obj是否相等
     */
    public void test2(){
        HashMap map = new HashMap();
        map.put("AA",123);
        map.put(45,123);
        map.put("BB",56);
        //Object get(Object key)
        System.out.println(map.get(45));//123
        //containsKey(Object key)
        boolean isExit = map.containsKey("BB");
        System.out.println(isExit);//true
        isExit = map.containsValue(123);
        System.out.println(isExit);//true
        map.clear();
        System.out.println(map.isEmpty());//true
    }
/*
    元視圖操作的方法:
    Set keySet():返回所有key構(gòu)成的Set集合
    Collection values(): 返回所有value構(gòu)成的Collection集合
    Set entrySet():返回所有key-value對構(gòu)成的Set集合
     */
    public void test3(){
        HashMap map = new HashMap();
        map.put("AA",123);
        map.put(45,123);
        map.put("BB",56);
        //遍歷所有的key集:keySet()
        Set set = map.keySet();
        Iterator iterator = set.iterator();
        while(iterator.hasNext()){
            System.out.println(iterator.next());//AA BB 45
        }
        System.out.println();
        //遍歷所有的value集:value()
        Collection values = map.values();
        for(Object obj : values){
            System.out.println(obj);// 123 56 123
        }
        System.out.println();
        //遍歷所有的key-value
        //方式一:entrySet()
        Set entrySet = map.entrySet();
        Iterator iterator1 = entrySet.iterator();
        while(iterator1.hasNext()){
            Object obj = iterator1.next();
            //entrySet集合中的元素都是entry
            Map.Entry entry = (Map.Entry)obj;
            System.out.println(entry.getKey() + "---->" + entry.getValue());
            //AA---->123
            //BB---->56
            //45---->123
        }
        System.out.println();
        //方式二:
        Set keySet = map.keySet();
        Iterator iterator2 = keySet.iterator();
        while(iterator2.hasNext()){
            Object key = iterator2.next();
            Object value = map.get(key);
            System.out.println(key + "======" + value);
            //AA======123
            //BB======56
            //45======123
        }
    }

總結(jié):常用方法
添加:put(Object key,Object value)
刪除:remove(Object key)
修改:put(Object key,Object value)
查詢:get(Object key)
長度:size()
遍歷:keySet() / values() / entrySet()

三、源碼分析

1.HashMap的底層實現(xiàn)原理?

以jdk7為例說明:

HashMap map = new HashMap():
在實例化以后,底層創(chuàng)建了長度是16的一維數(shù)組Entry[] table.
...可能已經(jīng)執(zhí)行過多次put...
map.put(key1,value1):
首先,調(diào)用key1所在類的hashCode()計算key1哈希值,此哈希值經(jīng)過某種算法計算以后,得到在Entry數(shù)組中的存放位置。
如果此位置上的數(shù)據(jù)為空,此時的key1-value1添加成功。----情況1
如果此位置上的數(shù)據(jù)不為空,(意味著此位置上存在一個或多個數(shù)據(jù)(以鏈表形式存在)),比較key1和已經(jīng)存在的一個或多個數(shù)據(jù)
的哈希值:
如果key1的哈希值與已經(jīng)存在的數(shù)據(jù)的哈希值都不相同,此時key-value1添加成功。----情況2
如果key1的哈希值和已經(jīng)存在的某一個數(shù)據(jù)(key-value2)的哈希值相同,繼續(xù)比較:調(diào)用key1所在類的equals(key2)方法
如果equals()返回false:此時key1-value1添加成功。----情況3
如果equals()返回true:使用value1替換value2.(修改作用的體現(xiàn))
補充:關(guān)于情況2和情況3:此時key1-value1和原來的數(shù)據(jù)以鏈表的方式存儲。
在不斷地添加過程中,會涉及到擴容問題,當超出臨界值(且要存放的位置非空)時,擴容。默認的擴容方式:擴容為原來容量的兩倍,并將原有的數(shù)據(jù)復制過來。

jdk8相較于jdk7在底層實現(xiàn)方面的不同:
1.new HashMap():底層沒有創(chuàng)建一個長度為16的數(shù)組
2.jdk 8底層的數(shù)組是:Node[],而非Entry[]
3.首次調(diào)用put()方法時,底層創(chuàng)建長度為16的數(shù)組
4.jdk7底層結(jié)構(gòu)只有:數(shù)組 + 鏈表。jdk8中底層結(jié)構(gòu):數(shù)組 + 鏈表 + 紅黑樹。

5. 形成鏈表時,七上八下(jdk7:新的元素指向舊的元素;jdk8:舊的元素指向新的元素)
當數(shù)組的某一個索引位置上的元素以鏈表形式存在的數(shù)據(jù)個數(shù) > 8 且當前數(shù)組的長度 > 64時。
此時此索引位置上的所有數(shù)據(jù)改為使用紅黑樹存儲。(重要優(yōu)化:提高查找效率)

DEFAULT_INITIAL_CAPACITY:HashMap的默認容量,16
DEFAULT_LOAD_FACTOR:HashMap的默認加載因子:0.75
threshold:擴容的臨界值,=容量*填充因子:16*0.75 =>12
TREEIFY_THRESHOLD:Bucket中鏈表長度大于該默認值,轉(zhuǎn)化為紅黑樹:8
MIN_TREEIFY_CAPACITY:桶中的Node被樹化時最小的hash表容量:64

2.LinkedHashMap的底層實現(xiàn)原理(了解)

LinkedHashMap的底層使用的結(jié)構(gòu)與HashMap相同,因為LinkedHashMap繼承于HashMap,區(qū)別就在于:LinkedHashMap內(nèi)部提供了Entry,替換HashMap中的Node.

源碼中:
      static class Entry<K,V> extends HashMap.Node<K,V>{
          Entry<K,V> before,after;//能夠記錄添加的元素的先后順序
          Entry(int hash, K key, V value,Node<K,V> next){
          super(hash, key, value, next);
          }
      }

TreeMap

 //向TreeMap中添加key-value,要求key必須是有同一個類創(chuàng)建的對象
    //因為要按照key進行排序:自然排序、定制排序
    @Test
    public void test1() {
        TreeMap map = new TreeMap();
        User u1 = new User("Tom", 23);
        User u2 = new User("Jerry", 32);
        User u3 = new User("Jack", 20);
        User u4 = new User("Rose", 18);
        map.put(u1, 98);
        map.put(u2, 89);
        map.put(u3, 76);
        map.put(u4, 100);
        Set entrySet = map.entrySet();
        Iterator iterator1 = entrySet.iterator();
        while (iterator1.hasNext()) {
            Object obj = iterator1.next();
            //entrySet集合中的元素都是entry
            Map.Entry entry = (Map.Entry) obj;
            System.out.println(entry.getKey() + "---->" + entry.getValue());
            //User{name='Jack', age=20}---->76
            //User{name='Jerry', age=32}---->89
            //User{name='Rose', age=18}---->100
            //User{name='Tom', age=23}---->98
        }
    }

Hashtable

> Hashtable 是個古老的 Map 實現(xiàn)類,JDK1.0就提供了。不同于 HashMap , Hashtable 是線程安 全的。
> Hashtable 實現(xiàn)原理和 HashMap 相同,功能相同。底層都使用哈希表結(jié)構(gòu),查詢速度快,很多情況 下可以互用。
> 與 HashMap 不同, Hashtable 不允許使用 null 作為 key 和 value
> 與 HashMap -樣, Hashtable 也不能保證其中 Key - Value 對的順序
> Hashtable 判斷兩個 key 相等、兩個 value 相等的標準,與 HashMap 一致。

四、Collections工具類

常用方法及其測試

public void test1(){
        ArrayList list = new ArrayList();
        list.add(123);
        list.add(43);
        list.add(765);
        list.add(765);
        list.add(765);
        list.add(-97);
        list.add(0);
        System.out.println(list);
//        Collections.reverse(list);
//        Collections.shuffle(list);
//        Collections.swap(list,1,2);
        int frequency = Collections.frequency(list, 765);
        System.out.println(list);
        System.out.println(frequency);
        /*
        Collections類中提供了多個synchronizedXxx()方法,該方法可使將指定集合包裝成線程同步的集合,從而可以解決多線程
        并發(fā)訪問集合時的線程安全問題
         */
        List list1 = Collections.synchronizedList(list);
    }
public void test2(){
        List list = new ArrayList();
        list.add(123);
        list.add(43);
        list.add(765);
        list.add(-97);
        list.add(0);
        //報異常:IndexOutOfBoundsException
//        List dest = new ArrayList();
//        Collections.copy(dest,list);
        //正確的:
        List  dest = Arrays.asList(new Object[list.size()]);
        System.out.println(dest.size());
        Collections.copy(dest,list);//5
        System.out.println(dest);//[123, 43, 765, -97, 0]
    }

到此這篇關(guān)于深入淺出講解Java集合之Map接口的文章就介紹到這了,更多相關(guān)Java Map內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java中Map和Set的常見用法舉例

    Java中Map和Set的常見用法舉例

    Map和Set是一種專門用來進行搜索的容器或者數(shù)據(jù)結(jié)構(gòu),其具體效率與具體的實例化子類有關(guān),下面這篇文章主要給大家介紹了關(guān)于Java中Map和Set的常見用法,需要的朋友可以參考下
    2024-04-04
  • Java對象不使用時賦值null的意義詳解

    Java對象不使用時賦值null的意義詳解

    這篇文章主要介紹了java對象不再使用時賦值null的意義,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-03-03
  • Java實戰(zhàn)之實現(xiàn)文件資料上傳并生成縮略圖

    Java實戰(zhàn)之實現(xiàn)文件資料上傳并生成縮略圖

    這篇文章主要介紹了通過Java實現(xiàn)文件資料的上傳并生成一個縮略圖,文中的示例代碼講解詳細,對我們學習Java有一定的幫助,感興趣的小伙伴可以了解一下
    2021-12-12
  • springboot文件上傳時maxPostSize設(shè)置大小失效問題及解決

    springboot文件上傳時maxPostSize設(shè)置大小失效問題及解決

    這篇文章主要介紹了springboot文件上傳時maxPostSize設(shè)置大小失效問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • SpringBoot項目中使用redis緩存的方法步驟

    SpringBoot項目中使用redis緩存的方法步驟

    本篇文章主要介紹了SpringBoot項目中使用redis緩存的方法步驟,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-12-12
  • Spring4如何自定義@Value功能詳解

    Spring4如何自定義@Value功能詳解

    這篇文章主要給大家介紹了關(guān)于Spring4如何自定義@Value功能的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用spring4具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
    2017-09-09
  • ireport數(shù)據(jù)表格報表的簡單使用

    ireport數(shù)據(jù)表格報表的簡單使用

    這篇文章給大家介紹了如何畫一個報表模板,這里介紹下畫表格需要用到的組件,文中通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2021-10-10
  • 基于JSON和java對象的互轉(zhuǎn)方法

    基于JSON和java對象的互轉(zhuǎn)方法

    下面小編就為大家?guī)硪黄贘SON和java對象的互轉(zhuǎn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • SpringBoot + vue2.0查詢所用功能詳解

    SpringBoot + vue2.0查詢所用功能詳解

    這篇文章主要介紹了SpringBoot + vue2.0查詢所用功能,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2023-11-11
  • Java中讀取配置文件的示例詳解

    Java中讀取配置文件的示例詳解

    這篇文章主要為大家詳細介紹了Java中讀取配置文件properties的相關(guān)方法,文中的示例代碼簡潔易懂,感興趣的小伙伴快跟隨小編一起學習一下吧
    2023-10-10

最新評論

布拖县| 贵定县| 绥江县| 金昌市| 巴马| 新宁县| 凌源市| 玛沁县| 贵德县| 长春市| 黄龙县| 铅山县| 双流县| 兴仁县| 本溪| 抚顺市| 定襄县| 临沧市| 马边| 玛曲县| 寻甸| 镇坪县| 康乐县| 科技| 鞍山市| 敦煌市| 纳雍县| 桂平市| 蒲江县| 西乌珠穆沁旗| 桂阳县| 靖安县| 宁晋县| 西安市| 宁波市| 准格尔旗| 石门县| 额济纳旗| 南康市| 林周县| 海原县|