NO IMAGE

直接上原始碼

  default V putIfAbsent(K key, V value) {
V v = get(key);
if (v == null) {
v = put(key, value);
}
return v;
}

原始碼中傳入key和value,根據key獲取看是否存在value,如果value==null,然後呼叫put方法把傳入的key和value  put進map,返回根據key獲取的老value

意思就是:putIfAbsent   如果傳入key對應的value已經存在,就返回存在的value,不進行替換。如果不存在,就新增key和value,返回null

注意內部實現是呼叫的put,putIfAbsent和put的區別,put不管什麼直接存入,返回舊值,putIfAbsent如果為null才存入,返回舊值。

下面列出一種我認為特別好的使用:處理重複資料與不重複資料,以重複資料為唯一,合併資料的方法。

直接例項:一個班級列表   list<class>  classes,一個班級物件實體類class,裡面是list<student> students列表

現在傳入記錄  list<data>  datas

學生  班級

張三    1

李四    1

王五    2

趙六    1

孫七   2

周八   1

吳九   2

如何把上面這些記錄儲存進classes,即相同班級下面,是一個列表,2班  {王五,孫七,吳九}

Map<String, List<student>> map=new HashMap<String,List<student>>();
List<student>  students;
for(data data:datas){
students= map.putIfAbsent(data.getClass(),new ArrayList<student>(datas.size()));
if (null == students) {
students= map.get(data.getClass();)
}
student student = new student();
student.setStudent(data.getStudent());
students.add(student);
}

主要看for迴圈內

第一次迴圈,map這個key沒有儲存,value為null,putIfAbsent所以儲存獲取的class返回null給students,接著為null根據key獲取新建的學生列表集合,然後新增學生

第二次,遇到這個key裡面存在資料,返回原來的list,所以不進if判斷,繼續新增新資料到這個list。

(注意:List<student> students;

與students = map.putIfAbsent(data.getClass(),new ArrayList<student>(datas.size()));

每次新建的時候students都指向新的,所以出現不同的班級的時候,這個學生list都是各個班級自己的list,然後新增本班學生就行了。)

儲存後就是,將一個列表classes裡面的每個class物件都儲存著一個class屬性,跟一個學生列表。就是把同一個班級的學生合併到了一起。