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());
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章