java軟件開發人中常常誤解區

  1. 數組(array)轉成集合(ArrayListjava

    錯誤:如常常這樣處理數組

           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));開發

  2. 檢查一個數組包含這個值(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;

  3. 在刪除一個循環內的集合元素

    考慮下面的代碼,迭代過程當中刪除元素:

       

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().源碼;

相關文章
相關標籤/搜索