天天看點

[Arrays,asList,ArrayList,程式員,String]Java程式員們最常犯的3個集合錯誤

  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()的源代碼。