1. 程式人生 > >集合轉陣列與陣列轉集合

集合轉陣列與陣列轉集合

一, 陣列轉集合

1, asList方法的使用

    public void test() {
		String[] arr = new String[] {"1", "2"};
		List<String> list = Arrays.asList(arr);
		System.out.println(list);
		list.add("3");	// 執行異常
		System.out.println(list);
		arr[0] = "4";  // list.get(0)隨之被修改
		System.out.println(list);
	}

2, 異常情況

第一種情況: list.add("3");     執行異常。

第二種情況:arr[0] = "4";  list.get(0)隨之被修改。

原因分析:

asList的返回物件是一個ArrayList, 此處的ArrayList是Arrays的內部類, 不是常用的直接實現了List介面的ArrayList, 沒有實現集合的修改方法。Arrays.asList()提現的是介面卡模式, 只是轉換介面, 後臺的資料仍是陣列。

 

二, 集合轉陣列

1,toArray方法的使用

   public void test() {
		List<String> list = new LinkedList<>();
		list.add("a");
		list.add("b");
		list.add("c");
		Object[] obj = list.toArray();
		System.out.println(Arrays.toString(obj));
		String[] arr = new String[list.size()];
		arr = list.toArray(arr);
		System.out.println(Arrays.toString(arr));	
	}

備註: 直接list.toArray()的返回值只能是Object[]型別, 不能強轉成指定型別; 所以需要先宣告指定型別的陣列, 再以引數形式傳進去,解決型別轉換問題。

 

三, 集合之間的操作

1, subList方法的使用

public void test() {
		List<String> list = new ArrayList<String>();  
        list.add("a");  
        // 使用構造器建立一個包含list的列表list1  
        List<String> list1 = new ArrayList<String>(list);  
        // 使用subList生成與list相同的列表list2  
        List<String> list2 = list.subList(0, list.size());  
        list2.add("b");  
        System.out.println(list.equals(list1));  // false
        System.out.println(list.equals(list2));  // true
	}

備註:

1, 使用構造器建立一個包含list的列表list1  
    List<String> list1 = new ArrayList<String>(list);  
 2, 使用subList生成與list相同的列表list2  
    List<String> list2 = list.subList(0, list.size());  

可以發現,list2為list的子list,當list2發生結構性修改(list2.add("b"))後,list也發生相應改變,所以返回結果為false和true。subList返回的是ArrayList的內部類SubList,並不是ArrayList而是ArrayList的一個檢視,對於SubList子列表的所有操作最終會反映到原列表上。