1.说明 (原文)
在Java中,经常遇到需要List与数组互相转换的场景。
List->数组,可以使用List的toArray()或者toArray(T[] a)方法。
数组->List,可以使用Arrays.asList()或者Collections.addAll()方法。
2.List->数组
2.1 Object[] toArray();
这个无参方法将List直接转为Object[]数组。
2.1.1 错误用法:
List<String> strList = new ArrayList<>();
strList.add("list-a");
strList.add("list-b");
String[] strArray = (String[]) strList.toArray();
错误原因:返回Object[]类型,无法强转成String[]类型
2.1.2 正确用法:
List<String> strList = new ArrayList<>();
Object[] strArray = strList.toArray();
得到了一个通常情况下没啥用的Object[]。 要想得到自己想要类型的数组,需要用toArray(T[] a)方法。
2.2 <T> T[] toArray(T[] a)
//list转数组
public void list2arrayTest(int size){
List<String> strList = new ArrayList<>();
strList.add("list-a");
strList.add("list-b");
String[] strArray1 = new String[size];
String[] strArray2 = strList.toArray(strArray1);
}
2.2.1 size<strList.size()
得到的strArray1和strArray2不是一个对象。
2.2.2 size==strList.size()
得到的strArray1和strArray2是一个对象。
2.2.3 size>strList.size()
得到的strArray1和strArray2是一个对象,数组中多余的位置为null。
3.数组->list
3.1使用Arrays.asList()方法
注意:
该方法的返回值是java.util.Arrays类中一个私有静态内部类java.util.Arrays.ArrayList,它并非java.util.ArrayList类。
java.util.Arrays.ArrayList类具有set(),get(),contains()等方法,
但是不支持添加add()或删除remove()方法,调用这些方法会报错。
//数组转list
public void array2listTest(){
String[] strArray = { "array-a", "array-b" };
List<String> strList = Arrays.asList(strArray);//Returns a fixed-size list backed by the specified array
strList.add("array-c");//会报错
}
错误信息:
Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.AbstractList.add(AbstractList.java:148)
at java.util.AbstractList.add(AbstractList.java:108)
at xn.xnjt.list.ArrayListTest.array2listTest(ArrayListTest.java:32)
at xn.xnjt.list.ArrayListTest.main(ArrayListTest.java:17)
解决办法:新建一个java.util.ArrayList对象,再添加元素。
//数组转list
public void array2listTest(){
String[] strArray = { "array-a", "array-b" };
List<String> strList = Arrays.asList(strArray);//Returns a fixed-size list backed by the specified array
List<String> strList1=new ArrayList<>(strList);
strList1.add("array-c");//会报错
}
3.2.使用Collections.addAll()方法
可以直接添加新元素
public void array2listTest1(){
String[] strArray = { "array-a", "array-b" };
List<String> strList = new ArrayList<>(strArray.length);
Collections.addAll(strList, strArray);
strList.add("array-c");
}