- Array转List
String[] s = new String[]{"A", "B", "C", "D","E"};
List<String> list = Arrays.asList(s);
注意这里list里面的元素直接是s里面的元素,对s的修改,直接影响list;
s[0] ="AA";
System.out.println("list: " + list);
// list: [AA, B, C, D, E]
- List转Array
String[] dest = list.toArray(new String[0]); // new String[0]是指定返回数组的类型
这里dest里面的元素不是list里面的元素,对list中关于元素的修改,不会影响dest。
- asList深入了解
一、为什么这里array转List后,修改array,list也会变化呢?
asList返回的确实是个ArrayList,但是这个并不是我们通常使用的java.util.ArrayList
,它是Arrays类的静态内部类,是比较简单粗糙的类:
<font color="red">1、没有扩容机制</font>
<font color = "red">2、无法添加元素,调用add(E element)会抛异常</font>
<font color = "blue">最根本的原因是这个内部类的E[] a是final的</font>
所以如果要修改List的大小,我们需要创建一个真正的ArrayList
String[] s = new String[]{"A", "B", "C", "D","E"};
List<String> list = new ArrayList<>(Arrays.asList(s));
同样,这里list里面的元素是s里面元素的引用,如果数组不是基本数据类型的包装类,而是自定义类型,那么通过数组对元素的修改,list里面相应元素也会改变
二、将基本数据类型数据的数组作为参数
int[] myArray = { 1, 2, 3 };
List myList = Arrays.asList(myArray);
System.out.println(myList.size());
这里打印的结果是1,myList里面只有一个元素,就是myArray,
这是因为,asList 方法的参数必须是对象或者对象数组,而原生数据类型不是对象,当传入一个原生数据类型数组时,asList 的真正得到的参数就不是数组中的元素,而是数组对象本身!此时List 的唯一元素就是这个数组。
正确做法应该使用包装类
Integer[] myArray = { 1, 2, 3 };
List myList = Arrays.asList(myArray);
System.out.println(myList.size());
网友评论