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

Java并發(fā)編程之詳解ConcurrentHashMap類(lèi)

 更新時(shí)間:2021年06月23日 14:39:17   作者:字母哥博客  
在之前的文章中已經(jīng)為大家介紹了java并發(fā)編程的工具:BlockingQueue接口、ArrayBlockingQueue、DelayQueue、LinkedBlockingQueue、PriorityBlockingQueue、SynchronousQueue、BlockingDeque接口,本文為系列文章第八篇.需要的朋友可以參考下

前言

由于Java程序員常用的HashMap的操作方法不是同步的,所以在多線程環(huán)境下會(huì)導(dǎo)致存取操作數(shù)據(jù)不一致的問(wèn)題,Map接口的另一個(gè)實(shí)現(xiàn)類(lèi)Hashtable 雖然是線程安全的,但是在多線程下執(zhí)行效率很低。為了解決這個(gè)問(wèn)題,在java 1.5版本中引入了線程安全的集合類(lèi)ConcurrentMap。

java.util.concurrent.ConcurrentMap接口是Java集合類(lèi)框架提供的線程安全的map,這意味著多線程同時(shí)訪問(wèn)它,不會(huì)影響map中每一條數(shù)據(jù)的一致性。ConcurrentMap接口有兩個(gè)實(shí)現(xiàn)類(lèi)ConcurrentHashMap和ConcurrentSkipListMap,經(jīng)常被使用的是ConcurrentHashMap,我們來(lái)重點(diǎn)關(guān)注它。

一、創(chuàng)建ConcurrentHashMap對(duì)象

通過(guò)下面的代碼創(chuàng)建ConcurrentHashMap

// 創(chuàng)建容量為8,負(fù)載系數(shù)為0.6的ConcurrentHashMap
ConcurrentHashMap<Key, Value> numbers = new ConcurrentHashMap<>(8, 0.6f);

使用上面的代碼,我們創(chuàng)建一個(gè)叫做numbers的ConcurrentHashMap對(duì)象。

  • Key - 用于關(guān)聯(lián)Map中每個(gè)元素的唯一標(biāo)識(shí)
  • Value - Map中每個(gè)元素,可以通過(guò)key值獲取value

需要我們特別注意的是new ConcurrentHashMap<>(8, 0.6).

  • capacity容量 - 第一個(gè)參數(shù)表示這個(gè)map的容量是8,也就是說(shuō)這個(gè)對(duì)象可以存儲(chǔ)8個(gè)鍵值對(duì)
  • loadFactor負(fù)載因子 - 這個(gè)map對(duì)象的負(fù)載因子是 0.6. 這意味著,每當(dāng)我們的哈希表被填滿60%的時(shí)候,條目就會(huì)被移動(dòng)到一個(gè)新的哈希表,其容量大小是原來(lái)哈希表的兩倍。

默認(rèn)容量與負(fù)載因子
我們還可以通過(guò)下面的代碼初始化一個(gè)ConcurrentHashMap對(duì)象,默認(rèn)情況下capacity=16,loadFactor=0.75

ConcurrentHashMap<Key, Value> numbers1 = new ConcurrentHashMap<>();

二、ConcurrentHashMap常用方法

2.1. 向ConcurrentHashMap插入元素

  • put(K,V) - 向map中插入key/value 鍵值對(duì)數(shù)據(jù)
  • putAll(map) - 把另一個(gè)map中的所有entries插入到當(dāng)前的map中
  • putIfAbsent(K,V) - 向map中插入key/value 鍵值對(duì)數(shù)據(jù),如果該鍵值對(duì)的key在map不存在則插入數(shù)據(jù),否則不做操作。
import java.util.concurrent.ConcurrentHashMap;

class Main {
    public static void main(String[] args) {
        // 創(chuàng)建ConcurrentHashMap 用于保存偶數(shù)
        ConcurrentHashMap<String, Integer> evenNumbers = new ConcurrentHashMap<>();

        // 使用put()方法插入數(shù)據(jù)
        evenNumbers.put("Two", 2);
        evenNumbers.put("Four", 4);

        // 使用putIfAbsent()插入數(shù)據(jù)
        evenNumbers.putIfAbsent("Six", 6);
        System.out.println("偶數(shù)集合ConcurrentHashMap: " + evenNumbers);

        //創(chuàng)建ConcurrentHashMap用于保存整數(shù)
        ConcurrentHashMap<String, Integer> numbers = new ConcurrentHashMap<>();
        numbers.put("One", 1);

        // 使用putAll()插入數(shù)據(jù)
        numbers.putAll(evenNumbers);
        System.out.println("整數(shù)集合ConcurrentHashMap: " + numbers);
    }
}

輸出結(jié)果:

偶數(shù)集合ConcurrentHashMap: {Six=6, Four=4, Two=2}
整數(shù)集合ConcurrentHashMap: {Six=6, One=1, Four=-4, Two=2}

2.2.批量獲取ConcurrentHashMap 元素

  • entrySet()- 獲取 map中key/value 鍵值對(duì)集合
  • keySet()- 獲取map中所有的key的集合
  • values()- 獲取map中所有的value的集合
import java.util.concurrent.ConcurrentHashMap;

class Main {
    public static void main(String[] args) {
        ConcurrentHashMap<String, Integer> numbers = new ConcurrentHashMap<>();

        numbers.put("One", 1);
        numbers.put("Two", 2);
        numbers.put("Three", 3);
        System.out.println("ConcurrentHashMap: " + numbers);

        // 獲取 map中key/value 鍵值對(duì)集合
        System.out.println("Key/Value mappings: " + numbers.entrySet());

        // 獲取map中所有的key的集合
        System.out.println("Keys: " + numbers.keySet());

        // 獲取map中所有的value的集合
        System.out.println("Values: " + numbers.values());
    }
}

輸出結(jié)果

ConcurrentHashMap: {One=1, Two=2, Three=3}
Key/Value mappings: [One=1, Two=2, Three=3]
Keys: [One, Two, Three]
Values: [1, 2, 3]

2.3. 獲取指定Key元素的value值

  • get() - 獲取指定key元素的value值,如果key不存在返回null
  • getOrDefault() - 獲取指定key元素的value值,如果key不存在返回一個(gè)指定的默認(rèn)值
import java.util.concurrent.ConcurrentHashMap;

class Main {
    public static void main(String[] args) {

        ConcurrentHashMap<String, Integer> numbers = new ConcurrentHashMap<>();
        numbers.put("One", 1);
        numbers.put("Two", 2);
        numbers.put("Three", 3);
        System.out.println("ConcurrentHashMap: " + numbers);

        // 獲取指定key元素的value值,如果key不存在返回null
        int value1 = numbers.get("Three");
        System.out.println("Using get(): " + value1);

        // 獲取指定key元素的value值,如果key不存在返回一個(gè)指定的默認(rèn)值
        int value2 = numbers.getOrDefault("Five", 5);
        System.out.println("Using getOrDefault(): " + value2);
    }
}

輸出結(jié)果

ConcurrentHashMap: {One=1, Two=2, Three=3}
Using get(): 3
Using getOrDefault(): 5

2.4.移除ConcurrentHashMap中的元素

  • remove(key) - 根據(jù)指定的key刪除map中的元素,并將該元素返回
  • remove(key, value) - 只有當(dāng)map中存在指定的鍵映射到指定的值時(shí),才會(huì)從map中刪除條目,并返回一個(gè)布爾值。返回true表示刪除成功,否則表示map中沒(méi)有這個(gè)鍵值對(duì)。
import java.util.concurrent.ConcurrentHashMap;

class Main {
    public static void main(String[] args) {

        ConcurrentHashMap<String, Integer> numbers = new ConcurrentHashMap<>();
        numbers.put("One", 1);
        numbers.put("Two", 2);
        numbers.put("Three", 3);
        System.out.println("ConcurrentHashMap: " + numbers);

        // 根據(jù)指定的key刪除map中的元素,并將該元素返回
        int value = numbers.remove("Two");
        System.out.println("Removed value: " + value);

        // 只有當(dāng)map中存在指定的鍵映射到指定的值時(shí),才會(huì)從map中刪除條目,并返回一個(gè)布爾值。
        boolean result = numbers.remove("Three", 3);
        System.out.println("Is the entry {Three=3} removed? " + result);

        System.out.println("Updated ConcurrentHashMap: " + numbers);
    }
}

輸出結(jié)果

ConcurrentHashMap: {One=1, Two=2, Three=3}
Removed value: 2
Is the entry {Three=3} removed? True
Updated ConcurrentHashMap: {One=1}

到此這篇關(guān)于Java并發(fā)編程之詳解ConcurrentHashMap類(lèi)的文章就介紹到這了,更多相關(guān)Java ConcurrentHashMap內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • IDEA?2020.3最新永久激活碼(免費(fèi)激活到?2099?年,親測(cè)有效)

    IDEA?2020.3最新永久激活碼(免費(fèi)激活到?2099?年,親測(cè)有效)

    分享一下?IntelliJ?IDEA?2020.3.1?最新激活注冊(cè)碼,破解教程如下,可免費(fèi)激活至?2099?年,親測(cè)有效,本文給大家分享兩種方法,感興趣的朋友參考下吧
    2021-01-01
  • Jmeter非GUI模式運(yùn)行分布式測(cè)試

    Jmeter非GUI模式運(yùn)行分布式測(cè)試

    這篇文章主要介紹了Jmeter非GUI模式運(yùn)行分布式測(cè)試,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • 一篇文章帶你了解Java基礎(chǔ)-多態(tài)

    一篇文章帶你了解Java基礎(chǔ)-多態(tài)

    這篇文章主要介紹了Java 多態(tài)的深入理解的相關(guān)資料,子類(lèi)繼承父類(lèi)的特征和行為,使得子類(lèi)具有父類(lèi)的各種屬性和方法?;蜃宇?lèi)從父類(lèi)繼承方法,使得子類(lèi)具有父類(lèi)相同的行為,需要的朋友可以參考下
    2021-08-08
  • 解決JPA @OneToMany及懶加載無(wú)效的問(wèn)題

    解決JPA @OneToMany及懶加載無(wú)效的問(wèn)題

    這篇文章主要介紹了解決JPA @OneToMany及懶加載無(wú)效的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • java中l(wèi)ambda表達(dá)式的分析與具體用法

    java中l(wèi)ambda表達(dá)式的分析與具體用法

    這篇文章主要給大家介紹了關(guān)于java中l(wèi)ambda表達(dá)式具體用法的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • Mybatis plus邏輯刪除失敗的BUG操作

    Mybatis plus邏輯刪除失敗的BUG操作

    這篇文章主要介紹了Mybatis plus邏輯刪除失敗的BUG操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-11-11
  • 利用spring-data-redis實(shí)現(xiàn)incr自增的操作

    利用spring-data-redis實(shí)現(xiàn)incr自增的操作

    這篇文章主要介紹了利用spring-data-redis實(shí)現(xiàn)incr自增的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-11-11
  • Spring Boot 排除某個(gè)類(lèi)加載注入IOC的操作

    Spring Boot 排除某個(gè)類(lèi)加載注入IOC的操作

    這篇文章主要介紹了Spring Boot 排除某個(gè)類(lèi)加載注入IOC的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Java中的位運(yùn)算符號(hào)解讀(&、|、^、~、<<、>>、>>>)

    Java中的位運(yùn)算符號(hào)解讀(&、|、^、~、<<、>>、>>>)

    這篇文章主要介紹了Java中的位運(yùn)算符號(hào)(&、|、^、~、<<、>>、>>>),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • Sping中如何處理@Bean注解bean同名的問(wèn)題

    Sping中如何處理@Bean注解bean同名的問(wèn)題

    這篇文章主要介紹了Sping中如何處理@Bean注解bean同名的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06

最新評(píng)論

牟定县| 安溪县| 游戏| 仁寿县| 隆尧县| 临邑县| 金堂县| 张北县| 凌源市| 龙南县| 梧州市| 周至县| 景宁| 金山区| 安福县| 独山县| 雷波县| 闸北区| 泉州市| 竹北市| 襄垣县| 达拉特旗| 西藏| 若羌县| 门头沟区| 怀来县| 汉寿县| 德兴市| 娱乐| 永善县| 米易县| 视频| 铜山县| 廊坊市| 福贡县| 惠东县| 闵行区| 惠安县| 许昌市| 东丰县| 大冶市|