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

Java之HashMap案例詳解

 更新時間:2021年08月10日 16:44:04   作者:Real_man  
這篇文章主要介紹了Java之HashMap案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下

概述

這篇文章,我們打算探索一下Java集合(Collections)框架中Map接口中HashMap的實現(xiàn)。Map雖然是Collctions框架的一部分,但是Map并沒有實現(xiàn)Collection接口,而Set和List是實現(xiàn)Collection接口的。

簡單來說,HashMap主要通過key存儲value值,并且提供了添加,獲取和操作存儲value的方法。HashMap的實現(xiàn)基于HashTable。


HashMap內(nèi)部呈現(xiàn)

Key-value對在內(nèi)部是以buckets的方式存儲在一起,最終成為一個表。存儲和檢索操作的時間是固定的,也就是時間復(fù)雜度為O(1)。

這篇文章暫時不過于涉及HashMap的底層,我們先對HashMap有個整體認(rèn)知。

put方法

Map中通過put方法來存儲一個value。

    /**
     * 建立鍵值對應(yīng)關(guān)系,如果之前已經(jīng)存在對應(yīng)的key,
     * 返回之前存儲的value,之前如果不存在對應(yīng)的key,返回null
     */
    public V put(K key, V value) {
        return putVal(hash(key), key, value, false, true);
    }

知識點一: 當(dāng)Map的調(diào)用put方法的時候,key對象被調(diào)用hashCode()方法,獲得一個hash值供hashmap使用。
我們創(chuàng)建一個對象來證實一下。

public class MyKey {
    private int id;
    
    @Override
    public int hashCode() {
        System.out.println("調(diào)用 hashCode()");
        return id;
    }

    // constructor, setters and getters 
}

   @Test
    public void mapKeyTest(){
        HashMap<MyKey,String> map = new HashMap<MyKey, String>();
        String retV = map.put(new MyKey(1),"value1");
    }

可以看到控制臺的輸出信息

調(diào)用 hashCode()

知識點二: hash()方法計算出的hash值可以標(biāo)識它在buckets數(shù)組中的索引位置。

HashMap的hash()方法如下:可以與put方法進行關(guān)聯(lián)。

static final int hash(Object key) {
        int h;
        return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
    }

HashMap有一個特點,它可以存儲null的key和null的value。當(dāng)key時null的時候,執(zhí)行put方法,它會自動分配hash為0. 這也意味著key為null的時候沒有hash操作,這樣就避免了空指針異常。

get() 方法

為了獲取存儲在hashMap中的對象,我們需要知道與它對應(yīng)的key。然后通過get方法把對應(yīng)的key傳到參數(shù)里。調(diào)用HashMap的get方法的時候,也會調(diào)用key對象的hashCode方法。

    @Test
    public void mapKeyTest(){
        HashMap<MyKey,String> map = new HashMap<MyKey, String>();
        MyKey key1 = new MyKey(1);
        map.put(key1,"value1");
        String retV =  map.get(key1);
    }

控制臺上可以看到兩行輸出

調(diào)用 hashCode()
調(diào)用 hashCode()

HashMap中的集合視圖

HashMap提供了三種方式,讓我們可以把key和value作為其它集合來使用。

Set<K> keys = map.keySet()
Collection<V> values = map.values()
Set<Entry<K, V>> entries = map.entrySet();

注意: 在iteators創(chuàng)建完畢后,對map的任何結(jié)構(gòu)修改,都會拋出一個異常。

@Test
public void givenIterator_whenFailsFastOnModification_thenCorrect() {
    Map<String, String> map = new HashMap<>();
    map.put("name", "baeldung");
    map.put("type", "blog");
 
    Set<String> keys = map.keySet();
    Iterator<String> it = keys.iterator();
    map.remove("type");
    while (it.hasNext()) {
        String key = it.next();
    }
}

// 會拋出java.util.ConcurrentModificationException異常

HashMap中唯一允許的修改是在iterator中移除元素。

public void givenIterator_whenRemoveWorks_thenCorrect() {
    Map<String, String> map = new HashMap<>();
    map.put("name", "baeldung");
    map.put("type", "blog");
 
    Set<String> keys = map.keySet();
    Iterator<String> it = keys.iterator();
 
    while (it.hasNext()) {
        it.next();
        it.remove();
    }
 
    assertEquals(0, map.size());
}

HashMap在iterator上的性能相比于LinkedHashMap和treeMap,性能非常糟糕。最差情況下為O(n),n為hashmap中條目的個數(shù)。

HashMap性能

HashMap的性能主要有兩個參數(shù)影響,初始容量和負(fù)載因子。初始容量為Map底層桶數(shù)組的長度,負(fù)載因子為當(dāng)桶容量的長度為多大的時候,重新開辟新的空間。

    int threshold;
    final float loadFactor;

默認(rèn)的初始容量為16,默認(rèn)的負(fù)載因子為0.75. 我們也可以自定義它們的值。

Map<String,String> hashMapWithCapacity=new HashMap<>(32);
Map<String,String> hashMapWithCapacityAndLF=new HashMap<>(32, 0.5f);

初始容量:

大的初始容量用于條目數(shù)較多,但是少量迭代(iteration)
小的初始容量用于條目數(shù)較少,但是多次迭代(iteration)

負(fù)載因子:
0.75是一個很折衷的方案了。在我們初始化HashMap的時候,初始容量和負(fù)載因子都應(yīng)該考慮在內(nèi),比如為了減少重新hash的操作,初始容量乘以負(fù)載因子應(yīng)該大于能存儲的最大條目數(shù),這樣就不會發(fā)生重新hash的操作。

最后

HashMap內(nèi)部有很多東西值得探索,這篇僅僅對HashMap做了一層表面的分析。接下來會深入分析。

到此這篇關(guān)于Java之HashMap案例詳解的文章就介紹到這了,更多相關(guān)Java之HashMap內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 淺談Java父子類加載順序

    淺談Java父子類加載順序

    本文主要介紹了Java父子類加載順序,那么這么長怎么記呀?本文就幫大家總結(jié)一下,更有利于記憶,感興趣的可以了解一下
    2021-08-08
  • Java簡單從文件讀取和輸出的實例

    Java簡單從文件讀取和輸出的實例

    下面小編就為大家?guī)硪黄狫ava簡單從文件讀取和輸出的實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • 簡單了解Java中的可重入鎖

    簡單了解Java中的可重入鎖

    這篇文章主要介紹了簡單了解Java中的可重入鎖,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-11-11
  • java的Guava工具包介紹

    java的Guava工具包介紹

    Java開發(fā)的同學(xué)應(yīng)該都使用或者聽說過Google提供的Guava工具包。日常使用最多的肯定是集合相關(guān)的工具類,還有Guava cache,除了這些之外Guava還提供了很多有用的功能,鑒于日常想用的時候找不到,這里就梳理一下Guava中那些好用的工具類,想優(yōu)化代碼的時候不妨過來看看
    2021-04-04
  • 解決Spring?Security集成knife4j訪問接口文檔出現(xiàn)403的問題

    解決Spring?Security集成knife4j訪問接口文檔出現(xiàn)403的問題

    這篇文章主要給大家介紹了如何解決Spring?Security集成knife4j訪問接口文檔出現(xiàn)403的問題,文中有詳細的解決方案,有需要的朋友可以參考閱讀下
    2023-07-07
  • SpringBoot整合Guava Cache實現(xiàn)全局緩存的示例代碼

    SpringBoot整合Guava Cache實現(xiàn)全局緩存的示例代碼

    這篇文章主要介紹了SpringBoot整合Guava Cache實現(xiàn)全局緩存,Guava Cache是Google Guava庫中的一個模塊,提供了基于內(nèi)存的本地緩存實現(xiàn),文中介紹了SpringBoot整合使用Guava Cache的具體步驟,需要的朋友可以參考下
    2024-03-03
  • Java之Maven工程打包jar

    Java之Maven工程打包jar

    Maven打包一般可以生成兩種包一種是可以直接運行的包,一種是依賴包(只是編譯包)。Maven默認(rèn)打包時jar,如果需要修改其他類型,可以修改pom.xml。感興趣的同學(xué)可以參考閱讀
    2023-04-04
  • Java+Selenium實現(xiàn)文件上傳下載功能詳解

    Java+Selenium實現(xiàn)文件上傳下載功能詳解

    這篇文章主要介紹了java代碼如何利用selenium操作瀏覽器上傳和下載文件功能,文中的示例代碼講解詳細,具有一定的借鑒價值,需要的可以參考一下
    2023-01-01
  • 基于Failed?to?load?ApplicationContext異常的解決思路

    基于Failed?to?load?ApplicationContext異常的解決思路

    這篇文章主要介紹了基于Failed?to?load?ApplicationContext異常的解決思路,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • 一篇文章帶了解如何用SpringBoot在RequestBody中優(yōu)雅的使用枚舉參數(shù)

    一篇文章帶了解如何用SpringBoot在RequestBody中優(yōu)雅的使用枚舉參數(shù)

    這篇文章主要介紹了SpringBoot中RequestBodyAdvice使用枚舉參數(shù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08

最新評論

贵州省| 桃江县| 安康市| 临沧市| 铜梁县| 福海县| 博白县| 盈江县| 绥阳县| 皋兰县| 兴安盟| 赤城县| 离岛区| 郯城县| 班玛县| 连江县| 新沂市| 桑植县| 全南县| 盐城市| 吴桥县| 东海县| 微博| 鄂尔多斯市| 胶州市| 东安县| 安徽省| 图木舒克市| 闽清县| 金塔县| 洛川县| 昆明市| 汉川市| 沁水县| 股票| 嘉黎县| 平武县| 故城县| 新丰县| 大兴区| 凤台县|