美文网首页
【Java】数组和List相互转换(asList)

【Java】数组和List相互转换(asList)

作者: 如雨随行2020 | 来源:发表于2022-01-27 19:03 被阅读0次
  • 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());

相关文章

网友评论

      本文标题:【Java】数组和List相互转换(asList)

      本文链接:https://www.haomeiwen.com/subject/fveraltx.html