天天看點

Arrays.asList()傳回的ArrayList,這是Arrays裡内嵌的一個私有靜态類,而并不是java.util.ArrayList類

測試代碼:

package array;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;

public class ArrayTest {

    @SuppressWarnings("unused")
    private static void asListTest(){
        String[] a = {"A", "B"};
        List<String> list = Arrays.asList(a);
        System.out.println(list.getClass().getName()); // java.util.Arrays$ArrayList
        System.out.println(list.contains("A")); // true
        list.add("C");
        /*
         * Jerry: 2016-01-15 9:09PM:
    Arrays.asList() 會傳回一個ArrayList,這是Arrays裡内嵌的一個私有靜态類,而并不是java.util.ArrayList類java.util.Arrays.ArrayList 有set(), get(), contains()方法,
    但并不支援添加元素,是以大小是固定的,想要建立一個真正的ArrayList,你應該:
    ArrayList<String> arrayList = new ArrayList<String>(Arrays.asList(arr));
         */
    }
    
    private static void removeInLoop() {
        ArrayList<String> list = new ArrayList<String>(Arrays.asList("a", "b", "c", "d"));

        // 下面這段代碼會觸發ConcurrentModificationException異常
                // 不能在循環裡直接修改一個集合類執行個體

        /*for (String s : list) {
            if (s.equals("a"))
                list.remove(s);
        }*/
                // 應該用疊代器來完成
        Iterator<String> iter = list.iterator();
        while (iter.hasNext()) {
            String s = iter.next();

            if (s.equals("a")) {
                iter.remove();
            }
        }
        list.forEach(System.out::println);
    }
    public static void main(String[] args) {
        // asListTest();
        removeInLoop();
        String[] a = {"A", "B"};
        // internal implementation: return new ArrayList<>(a);
        List<String> list1 = Arrays.asList(a);
        List<String> list2 = Arrays.asList(a);
        List<String> list3 = Arrays.asList(a);
        System.out.println(list1);
        System.out.println(list2);
        System.out.println(list3);
                /* 這行代碼會觸發異常:
             Exception in thread "main" java.lang.UnsupportedOperationException
         at java.base/java.util.AbstractList.add(AbstractList.java:153)
         at java.base/java.util.AbstractList.add(AbstractList.java:111)
         at array.ArrayTest.main(ArrayTest.java:57)
                */
        // list3.add("C");
        System.out.println(list1.getClass().getCanonicalName());
    }
}      

繼續閱讀