1.将數組轉化為清單
将數組轉化為一個清單時,程式員們經常這樣做:
List list=Arrays.asList(arr);
Arrays.asList() 會傳回一個ArrayList對象,ArrayList類是Arrays的一個私有靜态類,而不是java.util.ArrayList 類,
java.util.Arrays.ArrayList類有set()、get()、contains()方法,但是沒有增加元素的方法,是以它的大 小是固定的,想要建立一個真正的ArrayList類,你應該這樣做:
ArrayList arrayList=new ArrayList(Arrays.asList(arr));
ArrayList的構造方法可以接受一個集合類型,剛好它也是
java.util.Arrays.ArrayList的超類。
2.判斷一個數組是否包含一個值
程式員們經常這樣做:
Set set=new HashSet(Arrays.asList(arr));
return set.contains(targetValue);
這段代碼起作用,但是沒有必要把一個數組轉化成清單,轉化為清單需要額外的時間。它可以像下面那樣簡單:
Arrays.asList(arr).contains(targetValue);
或者是:
for (String s : arr) {
if (s.equals(targetValue)) {
return true;
}
return false;
很顯然第一種方法比第二種更容易讀
3.在一個循環中删除一個清單中的元素
思考下面這一段在循環中删除多個元素的的代碼:
ArrayList list=new ArrayList(Arrays.asList("a", "b", "c", "d"));
for (int i=0; i < list.size(); i++) {
list.remove(i);
System.out.println(list);
輸出結果是:
[b,d]
在這個方法中有一個嚴重的錯誤。當一個元素被删除時,清單的大小縮小并且下标變化,是以當你想要在一個循環中用下标删除多個
二手手機号買賣平台元素的時候,它并不會正常的生效。
你也許知道在循環中正确的删除多個元素的方法是使用疊代,并且你知道java中的foreach循環看起來像一個疊代器,但實際上并不是。考慮一下下面的代碼:
ArrayList list=new ArrayList(Arrays.asList("a","b","c","d"));
for(String s:list){
if(s.equals("a")){
list.remove(s);
它會抛出一個
ConcurrentModificationException異常。
相反下面的顯示正常:
ArrayList list=new ArrayList(Arrays.asList("a", "b","c", "d"));
Iterator iter=list.iterator();
while (iter.hasNext()) {
String s=iter.next();
if (s.equals("a")) {
iter.remove();
.next() 必須在.remove()之前調用。在一個foreach循環中,編譯器會使.next()在删除元素之後被調用,是以就會抛出
ConcurrentModificationException異常,你也許希望看一下ArrayList.iterator()的源代碼。