直接上原始碼
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屬性,跟一個學生列表。就是把同一個班級的學生合併到了一起。
写评论
很抱歉,必須登入網站才能發佈留言。