數組(array)轉成集合(ArrayList)java
錯誤:如常常這樣處理數組
List<String> list = Array.asList(arr);spa
Arrays.asList()方法返回的是Arrays裏的私有靜態內部類ArrayList,不是集合java.util.ArrayList類。這是java.util.Arrays.Arrys.ArrayList類內部只有三個方法 set(),get(),contains(),但沒有增長元素方法,所以他大小是不變的。要想建立一個集合ArrayList,這樣的如:code
ArrayList<String> arrayList = new ArrayList<String>(Arrays.asList(arr));開發
檢查一個數組包含這個值(check if an Array contains a value)rem
開發人員常常這樣作:get
Set<String> set = new HashSet<String>(Arrays.asList(arr));源碼
return set.contains(targetValue);it
代碼上多執行了幾步,必需先轉換成一個集合再給set;io
能夠這樣寫:
Arrays.asList(arr).contains(targetValue); or for(String s:arr){if(s.equals(targetValue))return true;}return false;
在刪除一個循環內的集合元素
考慮下面的代碼,迭代過程當中刪除元素:
ArrayList<String> list = new ArrayList<String>(Arrays.asList("a","b","c","d")); for(int i = 0; i< list.size();i++){ list.remove(i); } System.out.println(list);
輸出結果:
[b,d]
在這個方法是嚴重問題,當集合裏一個元素被刪除時,集合長度縮小、下標也發生改變。所以若是使用下標刪除循環裏的元素,這將正確刪除元素。
你可能知道,使用iterator實現元素刪除,也知道用foreach像iterator同樣刪除,但實際上不能的,考慮下面代碼:
ArrayList<String> list = new ArrayList<String>(Arrays.asList("a","b","c","d")); for(String s: list) { if(s.equals("a")) list.remove(s); }
它會拋出ConcurrentModificationException異常
相反就能夠:
ArrayList<String> list = new ArrayList<String>(Arrays.asList("a","b","c","d")); Iterator<String> iter = list.iterator(); while(iter.hasNext()) { String s = iter.next(); if(s.equals("a")) { iter.remove(); } }
.next 必須在調用.remove()方法前。在foreach循環裏,先刪除元素而後在調用.next下面元素,這個緣由引發ConcurrentModificationException異常,你可能想看ArrayList.iterator().源碼;