put與putIfAbsent區別
put與putIfAbsent區別:
put在放入資料時,如果放入資料的key已經存在與Map中,最後放入的資料會覆蓋之前存在的資料,
而putIfAbsent在放入資料時,如果存在重複的key,那麼putIfAbsent不會放入值。
putIfAbsent 如果傳入key對應的value已經存在,就返回存在的value,不進行替換。如果不存在,就新增key和value,返回null
底層實現:
public V put(K key, V value) { if (value == null) throw new NullPointerException(); int hash = hash(key.hashCode()); return segmentFor(hash).put(key, hash, value, false); } public V putIfAbsent(K key, V value) { if (value == null) throw new NullPointerException(); int hash = hash(key.hashCode()); return segmentFor(hash).put(key, hash, value, true); }
例子:
package com.xx;import java.util.HashMap;import java.util.Map;/** * JustForTest * * @create 2018-06-20 12:14 */public class TestHan { public static void main(String[] args) { /** * put */ Map<Integer,String> map = new HashMap<>(); map.put(1,"ZhangSan"); map.put(2,"LiSi"); map.put(1,"WangWu"); map.forEach((key,value) ->{ System.out.println("key : " + key + " , value : " + value); }); /** * putIfAbsent */ Map<Integer,String> putIfAbsentMap = new HashMap<>(); putIfAbsentMap.put(1,"張三"); putIfAbsentMap.put(2,"李四"); putIfAbsentMap.put(1,"王五"); putIfAbsentMap.forEach((key,value) ->{ System.out.println("key : " + key + " , value : " + value); }); }}
輸出結果:
key : 1 , value : WangWu
key : 2 , value : LiSi
key : 1 , value : 張三
key : 2 , value : 李四
package com.xx;import com.alibaba.fastjson.JSON;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;/** * JustForTest * * @create 2018-06-20 12:14 */public class TestHan { /** * 處理重複資料與不重複資料,以重複資料為唯一,合併資料的方法。 */ public static void main(String[] args) { List<Student> list = new ArrayList<>(); list.add(new Student("張三", 1)); list.add(new Student("李四", 1)); list.add(new Student("王五", 2)); list.add(new Student("趙六", 1)); list.add(new Student("孫七", 2)); list.add(new Student("周八", 1)); list.add(new Student("吳九", 2)); //對於上面的學生、如果根據班級進行區分?! Map<Integer,List<Student>> map = new HashMap<>(); List<Student> students; for(Student s : list) { /** * put不管什麼直接存入,返回舊值 * putIfAbsent如果為null才存入,返回舊值。 */ students = map.putIfAbsent(s.getInClass(),new ArrayList<Student>(list.size())); if (null == students) { students = map.get(s.getInClass()); } students.add(s); } //迴圈Map map.forEach((key,value) -> { System.out.println("班級:" + key + ",人員:" + JSON.toJSONString(value)); }); }}
package com.xx;/** * @author hanliwei * @create 2018-06-20 16:00 */public class Student { private String name; //姓名 private Integer inClass;//所屬班級 Student(String name,Integer inClass) { this.name = name; this.inClass = inClass; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getInClass() { return inClass; } public void setInClass(Integer inClass) { this.inClass = inClass; }}
------------------------------
Java8之Map的其他一些方法
------------------------------
Map<Integer,String> map = new HashMap<>();map.put(1,"a");map.put(2,"b");map.put(3,"c");
/** * 1.getOrDefault 方法 * * 如果指定的key存在,則返回該key對應的value, * 如果不存在,則返回指定的值。 * * 例子:key為4不存在,輸出d */System.out.println(map.getOrDefault(4,"d"));
輸出:d
/** * 2.forEach 方法 * * 遍歷Map中的所有Entry, 對key, value進行處理, 接收引數 (K, V) -> void, */map.forEach((key,value) -> System.out.println("key : " + key + " , value:" + value));
輸出:
key : 1 , value:a
key : 2 , value:b
key : 3 , value:c
/** * 3.replaceAll 方法 * 替換Map中所有Entry的value值,這個值由舊的key和value計算得出, 接收引數 (K, V) -> V */map.replaceAll((key,value) -> ("new" + key) + value);map.forEach((key,value) -> System.out.println("key : " + key + " , value:" + value));
輸出:
key : 1 , value:new1a
key : 2 , value:new2b
key : 3 , value:new3c
/** * 4.putIfAbsent 方法 * 如果key關聯的value不存在,則關聯新的value值,返回key關聯的舊的值 */map.putIfAbsent(3, "d");map.putIfAbsent(4, "d");System.out.println(map.get(3));System.out.println(map.get(4));
輸出:
c
d
/** * 5.remove方法 * 接收2個引數,key和value,如果key關聯的value值與指定的value值相等(equals),則刪除這個元素 */map.remove(1,"b");System.out.println(map.get(1));//未刪除成功,輸出amap.remove(2,"b");System.out.println(map.get(2));//刪除成功,輸出null
/** * 6.replace(K key, V oldValue, V newValue) 方法 * 如果key關聯的值與指定的oldValue的值相等,則替換成新的newValue */map.replace(3,"a","z");System.out.println(map.get(3));//未替換成功,輸出cmap.replace(1,"a","z");System.out.println(map.get(1));//替換成功,輸出z
/** * 7.replace(K key, V value) 方法 * 如果map中存在key,則替換成value值,否則返回null */// 輸出舊的值, aSystem.out.println(map.replace(1, "aa"));// 替換成功,輸出新的值, aaSystem.out.println(map.get(1));// 不存在key為4, 輸出 nullSystem.out.println(map.replace(4, "d"));// 不存在key為4, 輸出 nullSystem.out.println(map.get(4));
/** * 8.computeIfAbsent 方法 * 如果指定的key不存在,則透過指定的K -> V計算出新的值設定為key的值 */map.computeIfAbsent(1, key -> key + " computed");// 存在key為1,則不進行計算,輸出值 aSystem.out.println(map.get(1));map.computeIfAbsent(4, key -> key + " computed");// 不存在key為4,則進行計算,輸出值 4 computedSystem.out.println(map.get(4));
/** * 9.computeIfPresent 方法 * 如果指定的key存在,則根據舊的key和value計算新的值newValue, * 如果newValue不為null,則設定key新的值為newValue, * 如果newValue為null, 則刪除該key的值, */map.computeIfPresent(1, (key, value) -> (key + 1) + value);// 存在key為1, 則根據舊的key和value計算新的值,輸出 2aSystem.out.println(map.get(1));map.computeIfPresent(2, (key, value) -> null);// 存在key為2, 根據舊的key和value計算得到null,刪除該值,輸出 nullSystem.out.println(map.get(2));
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/1762/viewspace-2815550/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- HTTP協議中PUT和POST使用區別HTTP協議
- 簡述六種請求方法,get、head、put、delete、post、options區別delete
- ??與?:的區別
- 解析HTTP協議六種請求方法,get,head,put,delete,post有什麼區別HTTP協議delete
- SAP ABAP Gateway Client 裡 OData 測試的 PUT, PATCH, MERGE 請求有什麼區別Gatewayclient
- mouseenter與mouseover區別
- currentTarget與target區別
- mouseout與mouseleave區別
- classList與className區別
- innerText與textContent區別
- GET與POST區別
- let與const區別
- NIO與IO區別
- 區別mouseover與mouseenter?
- ApplicationContext 與 BeanFactory 區別APPContextBean
- setInterval()與setTimeout()區別
- match()與exec()區別
- localStorage與sessionStorage 區別Session
- showModal()與show() 區別
- <section>與<article> 區別
- onmouseover與onmouseenter區別
- offset與style區別
- cellpadding與cellspacing 區別padding
- animation與transition 區別
- encodeURI與encodeURIComponent區別
- JavaScript與ECMAScript 區別JavaScript
- FragmentPagerAdapter與FragmentStatePagerAdapter區別FragmentAPT
- JavaScript 與TypeScript區別JavaScriptTypeScript
- __weak與__block區別,深層理解兩者區別BloC
- 值型別與引用型別的區別型別
- 耦合與聚合的區別比單體與微服務區別更重要微服務
- HashMap底層實現原理/HashMap與HashTable區別/HashMap與HashSet區別HashMap
- preventDefault()與return false區別False
- const與static的區別
- HTTP 與 HTTPS 的區別HTTP
- getAttribute() 與 attr() 的區別
- input與change事件區別事件
- @import與<link> 的區別Import