Java Arrays.asList()使用注意(排雷排坑!!!)

Java數組轉集合?肯定想到使用Arrays.asList(),注意雷區,小心踩雷。

1.雷區一

  • 先來看一個程序示例:
	 	int[] arr = {1,2,3,4,5};
	    List list = Arrays.asList(arr);
	    System.out.println(list.size());
	    System.out.println(list);
	    // list.size() = 1
  • 結果:
    在這裏插入圖片描述
  • 按理說得到到List.size()的大小應該爲5,但是程序輸出結果爲1,所以這就是第一個雷區,看看Arrays.asList的源碼:
//.....以上源碼信息已省略
 @SafeVarargs
    @SuppressWarnings("varargs")
    public static <T> List<T> asList(T... a) {
        return new ArrayList<>(a);
    }
//.....以下源碼信息已省略
  • Arrays.asList源碼:傳入一個變長泛型參數(注意泛型!),返回一個List集合,在Java中,泛型要求包容的是對象類型,而基本數據類型在Java中不屬於對象,但是在示例代碼中傳入一個int[]類型的數組,程序並沒有報錯,是因爲int[]是一個數組對象,示例代碼把int類型的數組作爲泛型傳入,所以代碼沒有報錯。
  • 所以使用Arrays.asList時,如果傳入數組類型爲基本數據類型,就使用對應的包裝類作爲入參:
	Integer[] arr = {1,2,3,4,5};
	List list = Arrays.asList(arr);
   	System.out.println("list.size() = "+list.size());
    System.out.println(list);
  • 結果:
    在這裏插入圖片描述

2.雷區二

  • 代碼示例:
		Integer[] arr = {1,2,3,4,5};
        List list = Arrays.asList(arr);
        System.out.println("list.size = "+ list.size());
        list.add(6);
        System.out.println("add -> list.size = "+ list.size());
  • 結果:
    在這裏插入圖片描述
  • java.lang.UnsupportedOperationException,List集合進行add()操作竟然報錯,同樣看源碼:
   /**
     * @serial include
     */
    private static class ArrayList<E> extends AbstractList<E>
        implements RandomAccess, java.io.Serializable
    {
        private static final long serialVersionUID = -2764017481108945198L;
        private final E[] a;

        ArrayList(E[] array) {
            a = Objects.requireNonNull(array);
        }
 //.....以下源碼信息已省略   
  • 從源碼可以看到這個ArrayList是一私有靜態內部類,這個類中並沒有提供add()和remove()方法,但是在它繼承的AbstractList父類中提供了add()和remove()方法,只是沒有提供具體的邏輯實現:
// 父類AbstractList
public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> {
 
	 public boolean add(E e) {
	        add(size(), e);
	        return true;
	 }
	    
	public E remove(int index) {
	        throw new UnsupportedOperationException();
	}
}
  • 也就是需要繼承的子類自己去覆寫父類中的add()和remove()方法,但是Arrays類中並沒有去進行覆寫,所以使用Arrays.asList返回的是一個長度不可變的列表,其集合長度取決於入參數組的長度,返回的列表不支持新增刪除操作。
  • 如果需要對Arrays.asList返回的list集合進行增刪操作的話,就需要將Arrays.asList返回的list轉換成 new ArrayList
  		Integer[] arr = {1,2,3,4,5};
        List list = Arrays.asList(arr);
        List arrayList = new ArrayList<>(list);
        System.out.println("list.size = "+ arrayList.size());
        arrayList.add(6);
        System.out.println("add -> list.size = "+ arrayList.size());
  • 結果:
    在這裏插入圖片描述
  • 最後這裏比較一下Arrays下的ArrayList 和 常用的ArrayList
    在這裏插入圖片描述
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章