Java ConcurrentHashMap的使用示例
構造方法
// 1.無參數構造方法 new ConcurrentHashMap(); // 2.指定初始容量 new ConcurrentHashMap(initialCapacity) // 3.指定初始容量和加載因子 new ConcurrentHashMap(initialCapacity,loadFactor) // 4.指定初始容量和加載因子與並發級別(並發更新線程數) new ConcurrentHashMap(initialCapacity, loadFactor, concurrencyLevel) // 5.創建與給定映射具有相同映射的新映射 new ConcurrentHashMap(Map<? extends K, ? extends V> m)
方法介紹
新增元素
// 1.添加元素,不允許null map.put(1,1); // 2.添加一個map map.putAll(map); // 3.添加元素, 鍵不存在映射關系才添加成功 map.putIfAbsent(2,1);
刪除元素
// 1.移除指定的key map.remove(1); // 2.移除指定的key,value map.remove(2,2);
替換元素
// 1.替換指定key map.replace(1,3); // 2.替換指定key,value map.replace(1,2,4); // 3.替換所有,這裡是把value都乘以2 map.replaceAll((key,value)->value << 1);
查找元素
// 1.返回到指定鍵所映射的值 map.get("精靈王"); // 2. 返回指定鍵映射到的值,如果此映射不包含該鍵的映射,則返回給定的默認值。 map.getOrDefault("精靈王","jinglingwang.cn"); // 指定搜素函數 // 1.通過在每個(鍵,值)上應用給定的搜索函數返回非空結果,如果沒有則返回null。 // 成功後,進一步的元素處理被抑制,並且搜索功能的任何其他並行調用的結果被忽略。 Object a = map.search(5,(key,value)->{ return (value & 1) == 0 ? value : null; // 查找第一個偶數,如果是奇數返回null }); // 2. 每個鍵上應用給定搜索函數的非null結果,如果沒有則返回null。 String k = map.searchKeys(5,(key)->{ return "jinglingwang".equals(key) ? key : null; }); System.out.println(k); // 3. 對每個值應用給定的搜索函數,如果沒有,返回null。 Integer v2 = map.searchValues(5,(value)->{ return value == 2 ? 520 : null; }); System.out.println(v2); // 4.從每個entry應用給定的搜索函數,如果沒有,則返回null。 Integer a = map.searchEntries(5,(entry)->{ System.out.println("entry:"+entry.getKey() + " " + entry.getValue()); return "jinglingwang.cn".equals(entry.getKey()) ? 1 : null; }); System.out.println(a);
包含
// 1. 驗證值是否存在, 等同於map.containsValue()方法 map.contains(4) // 2. 驗證key是否存在 map.containsKey("精靈王") // 3. 驗證值是否存在,等同於map.contains()方法 map.containsValue(4)
遍歷
// 1.返回此表中鍵的枚舉 map.keys(); // 2.返回此地圖中包含的鍵的Set視圖 map.keySet(); // 3.返回此地圖中鍵的Set視圖,使用給定的映射值 map.keySet(100) // 4. 返回此表中值的枚舉。 map.elements(); // 5.返回此地圖中包含的映射的Set視圖。 map.entrySet().forEach((entry)->{ System.out.println(entry.getKey() + " " + entry.getValue()); }); // 6.1 同時遍歷key,value map.forEach((key,value)->{ System.out.println(key+ " " + value); }); // 6.2 同時遍歷key,value,找到滿足條件的執行響應函數 map.forEach(5,(key,value)->{ System.out.println(key+ " " + value); return (value & 1) == 0 ? "jinglingwang.cn" : null; },aa->{ System.out.println(aa); // 條件中有偶數,每次就輸出jinglingwang.cn }); // 7.1遍歷 map.forEachEntry(5,(entry)->{ System.out.println(entry.getKey() + " " + entry.getValue()); }); // 7.2遍歷查找,滿足條件執行響應的函數 map.forEachEntry(5,(entry)->{ System.out.println(entry.getKey() + " " + entry.getValue()); return (value & 1) == 0 ? "jinglingwang.cn" : null; },aa->{ System.out.println(aa); // 條件中有偶數,每次就輸出jinglingwang.cn }); // 8.1遍歷key map.forEachKey(5,key->{ System.out.println("key: " + key); }); // 8.2遍歷key,滿足條件的key執行響應的函數 map.forEachKey(5,key->{ System.out.println("key: " + key); return !key.equals("jinglingwang") ? "jinglingwang.cn" : null; },kk ->{ System.out.println(kk); }); // 9.1 遍歷value map.forEachValue(5,value->{ System.out.println("value: " + value); }); // 9.2 遍歷value,滿足條件的value執行響應的函數 map.forEachValue(5,value->{ System.out.println("value: " + value); return (value & 1) == 0 ? "jinglingwang.cn" : null; },vv ->{ System.out.println(vv); });
reduce歸約
reduce()
//新增元素 map.put("1",0); map.put("2",4); map.put("3",6); map.put("4",8); // 1. 返回使用給定的reducer組合值來累積所有(鍵,值)對的給定轉換的結果,如果沒有,則返回null String res = map.reduce(5,(key,value)->{ System.out.println("transformer key:"+key+" value:"+value); return value+""; },(key,value)->{ System.out.println("reducer key:"+key+" value:"+value); return key+value+""; }); System.out.println("res:"+res);
以上示例輸出如下:
transformer key:1 value:0 transformer key:2 value:4 reducer key:0 value:4 transformer key:3 value:6 reducer key:04 value:6 transformer key:4 value:8 reducer key:046 value:8 res:0468
第一個transformer函數遍歷整個map,然後將返回值傳遞到reduce函數進行計算,之後reduce函數的返回值再次參與到下一次的reduce函數的計算中。
reduceToDouble()
double reduceToDouble = map.reduceToDouble(5,(key,value)->{ System.out.println("transformer key:"+key); return value; },100,(key,value)->{ System.out.println("reducer key:"+key+" value:"+value); return key+value; }); System.out.println("reduceToDouble:"+reduceToDouble); // 輸出結果 transformer key:1 value:0 reducer key:100.0 value:0.0 transformer key:2 value:4 reducer key:100.0 value:4.0 transformer key:3 value:6 reducer key:104.0 value:6.0 transformer key:4 value:8 reducer key:110.0 value:8.0 reduceToDouble:118.0
遍歷歸約所有的鍵值對,並把結果轉換成double類型。
類似的方法還有reduceToInt()和reduceToLong()。
reduceEntries()
// 第一種,返回值為entry Map.Entry reduceEntries = map.reduceEntries(5,entry->{ System.out.println("transformer key:"+entry.getKey()+" value:"+entry.getValue()); return entry; },(key,value)->{ System.out.println("reducer key:"+key+" value:"+value); return value; }); System.out.println("reduceEntries:"+reduceEntries); // 輸出如下 transformer key:1 value:0 transformer key:2 value:4 reducer key:1=0 value:2=4 transformer key:3 value:6 reducer key:2=4 value:3=6 transformer key:4 value:8 reducer key:3=6 value:4=8 reduceEntries:4=8 // 第二種 String reduceEntries2 = map.reduceEntries(5,(entry)->{ System.out.println("transformer key:"+entry.getKey()+" value:"+entry.getValue()); return entry.getValue()+""; },(key,value)->{ System.out.println("reducer key:"+key+" value:"+value); return key+value+""; }); System.out.println("reduceEntries2:"+reduceEntries2); transformer key:1 value:0 transformer key:2 value:4 reducer key:0 value:4 transformer key:3 value:6 reducer key:04 value:6 transformer key:4 value:8 reducer key:046 value:8 reduceEntries2:0468
transformer 函數每次返回的是一個entry,然後會傳入到reduce函數中,reduce的return值會繼續傳遞到下一次的reduce計算。
reduceEntriesToDouble()
// 返回使用給定的reducer累加給定變換的結果,以組合值,給定基礎作為一個標識值 Double reduceEntriesToDouble = map.reduceEntriesToDouble(5,entry->{ System.out.println("transformer key:"+entry.getKey()+" value:"+entry.getValue()); return Double.valueOf(entry.getValue()); },100,(l,r)->{ System.out.println("reducer key:"+l+" value:"+r); return l+r; }); System.out.println("reduceEntriesToDouble:"+reduceEntriesToDouble); // 輸出結果 transformer key:1 value:0 reducer key:100.0 value:0.0 transformer key:2 value:4 reducer key:100.0 value:4.0 transformer key:3 value:6 reducer key:104.0 value:6.0 transformer key:4 value:8 reducer key:110.0 value:8.0 reduceEntriesToDouble:118.0
其中transformer函數是以entry的形式來進行遍歷的,第三個參數是一個歸約的標識(初始默認值),功能和reduceEntriesToInt()和reduceEntriesToLong()兩個方法非常相似。
reduceKeys()
// 1.第一種,隻有reduce函數,遍歷所有的鍵值對,reduce函數的返回值會作為下一次的key,如果沒有則返回null。 String newKey = map.reduceKeys(5,(key,value)->{ System.out.println("reducer key:"+key+" value:"+value); return key+value; **}**); System.out.println("newKey:"+newKey); // 輸出結果 reducer key:1 value:2 reducer key:12 value:3 reducer key:123 value:4 newKey:1234 // 2.第二種,有transformer和reducer String newValue = map.reduceKeys(5,(key)->{ System.out.println("transformer key:"+key); return key; },(key,value)->{ System.out.println("reducer key:"+key+" value:"+value); return key+value; }); System.out.println("newValue:"+newValue); // 輸出結果 transformer key:1 transformer key:2 reducer key:1 value:2 transformer key:3 reducer key:12 value:3 transformer key:4 reducer key:123 value:4 newValue:1234
reduceKeysToDouble()
double reduceKeysToDouble = map.reduceKeysToDouble(5,(key)->{ System.out.println("transformer key:"+key); return Double.parseDouble(key); },100,(key,value)->{ System.out.println("reducer key:"+key+" value:"+value); return key+value; }); System.out.println("reduceKeysToDouble:"+reduceKeysToDouble);
遍歷歸約所有的key,並把結果轉換成double類型。
類似的方法還有reduceKeysToInt()和reduceKeysToLong()。
reduceValues()
// 第一種:僅reducer函數 double reduceValues = map.reduceValues(5,(key,value)->{ System.out.println("reducer key:"+key+" value:"+value); return key+value; }); System.out.println("reduceValues:"+reduceValues); //輸出結果 reducer key:0 value:4 reducer key:4 value:6 reducer key:10 value:8 reduceValues:18.0 // 第二種,含有transformer double reduceValues2 = map.reduceValues(5,(value)->{ System.out.println("transformer value:"+value); return Double.valueOf(value); },(key,value)->{ System.out.println("reducer key:"+key+" value:"+value); return key+value; }); System.out.println("reduceValues2:"+reduceValues2); // 輸出結果 transformer value:0 transformer value:4 reducer key:0.0 value:4.0 transformer value:6 reducer key:4.0 value:6.0 transformer value:8 reducer key:10.0 value:8.0 reduceValues2:18.0
reduceValuesToDouble()
double reduceValuesToDouble = map.reduceValuesToDouble(5,(value)->{ System.out.println("transformer value:"+value); return Double.valueOf(value); },100,(l,r)->{ System.out.println("reducer key:"+l+" value:"+r); return l+r; }); System.out.println("reduceValuesToDouble:"+reduceValuesToDouble); // 輸出結果 transformer value:0 reducer key:100.0 value:0.0 transformer value:4 reducer key:100.0 value:4.0 transformer value:6 reducer key:104.0 value:6.0 transformer value:8 reducer key:110.0 value:8.0 reduceValuesToDouble:118.0
遍歷歸約所有的value,並把結果轉換成double類型。
類似的方法還有reduceValuesToInt()和reduceValuesToLong()。
以上就是Java ConcurrentHashMap的使用示例的詳細內容,更多關於Java ConcurrentHashMap的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- Java中Map接口使用以及有關集合的面試知識點匯總
- 詳解Java集合類之Map篇
- java map中相同的key保存多個value值方式
- Java實現HashMap排序方法的示例詳解
- Java Map接口概述和常用方法詳解