集合轉陣列與陣列轉集合
阿新 • • 發佈:2018-11-12
一, 陣列轉集合
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子列表的所有操作最終會反映到原列表上。