美文网首页技术分享
Arrays.asList的坑

Arrays.asList的坑

作者: 盼旺 | 来源:发表于2019-09-29 17:15 被阅读0次

简介:

将一个数组转换为 List 以便进行更丰富的操作

坑一: 将原生数据类型数据的数组作为参数

public class Main {
    public static void main(String[] args) {
      int[] test = new int[]{1,2,3,4};
      List list = Arrays.asList(test);
        System.out.println(list.size());
        System.out.println(list);
/*
1
[[I@45ee12a7]
*/
    }
}

尝试使用IDEA自动修复看看它传入的类型:居然是int[]



也就是说T是数组元素的 class
如果你对反射技术比较了解的话,那么 class 的含义想必是不言自明。我们知道任何类型的对象都有一个 class 属性,这个属性代表了这个类型本身。原生数据类型,比如 int,short,long等,是没有这个属性的,具有 class 属性的是它们所对应的包装类 Integer,Short,Long。
  因此,这个错误产生的原因可解释为:asList 方法的参数必须是对象或者对象数组,而原生数据类型不是对象——这也正是包装类出现的一个主要原因。当传入一个原生数据类型数组时,asList 的真正得到的参数就不是数组中的元素,而是数组对象本身!此时List 的唯一元素就是这个数组。
解决方案:使用包装类数组或使用流转换为List
1.
public class Main {
    public static void main(String[] args) {
      Integer[] test = new Integer[]{1,2,3,4};
      List list = Arrays.asList(test);
        System.out.println(list.size());
        System.out.println(list);
/*
4
[1, 2, 3, 4]
*/
    }
}

2.
public class Main {
    public static void main(String[] args) {
      int[] test = new int[]{1,2,3,4};
//Java 8 新引入的 Stream 操作 要将一个原始类型流转换成一个对象流,可以使用boxed方法
        List myList = Arrays.stream(test).boxed().collect(Collectors.toList());
        System.out.println(myList.size());
        System.out.println(myList);
/*
4
[1, 2, 3, 4]
*/
    }
}

坑二:试图修改 List 的大小

public class Main {
    public static void main(String[] args) {
      Integer[] test = new Integer[]{1,2,3,4};
      List list = Arrays.asList(test);
      Integer a = new Integer(1);
      list.add(a);
//Exception in thread "main" java.lang.UnsupportedOperationException
    }
}

直接报错
向 list 添加新元素是不被允许的;
如果试图从 myList 中删除元素,也会抛出相同的异常。为什么会如此?
官方指出有一句话:
Arrays.asList返回一个由指定数组生成的固定大小的 List。
查看相关的源码


方法中的的确确生成了一个 ArrayList 再点进去看

有一个被声明为 final 的数组 a ,所有传入的元素都会被保存在这个数组 a 中。到此,谜底又揭晓了: asList 方法返回的确实是一个 ArrayList ,但这个 ArrayList 并不是 java.util.ArrayList ,而是 java.util.Arrays 的一个内部类。这个内部类用一个 final 数组来保存元素,因此用 asList 方法产生的 ArrayList 是不可修改大小的。这里记住最后是一个final数组保存的元素
与下面final修饰区分

final List<Integer> list1 = new ArrayList<>();
list1.add(new Integer(1));
list1.add(new Integer(2));
System.out.println(list1);
//[1,2]

解决方案:创建一个真正的 ArrayList

Integer[] test = new Integer[]{1,2,3,4};
List list = new ArrayList(Arrays.asList(test));
list.add(new Integer(5));
System.out.println(list);
//[1, 2, 3, 4, 5]

参考文章
https://www.jianshu.com/p/2b113f487e5e

相关文章

  • 为什么要谨慎使用Arrays.asList、ArrayList的

    1. 使用Arrays.asList的注意事项 1.1 可能会踩的坑 先来看下Arrays.asList的使用: ...

  • 为什么要谨慎使用Arrays.asList、ArrayList的

    1. 使用Arrays.asList的注意事项 1.1 可能会踩的坑 先来看下Arrays.asList的使用: ...

  • Arrays.asList的坑

    碰到这样一个问题使用Arrays.asList返回的ArrayList无法进行add,remove操作,测试一下原...

  • Arrays.asList的坑

    简介: 将一个数组转换为 List 以便进行更丰富的操作 坑 坑一: 将原生数据类型数据的数组作为参数 尝试使用I...

  • Arrays.asList()方法的坑

    需求:快速将数组转化为集合,并且还能继续往里面添加元素错误方法:TestAsList.java 程序报错: 为什么...

  • 坑之Arrays.asList

    我写了下面这么段代码 结果就报错了,马有失蹄,人有失手啊,确实是我基础差了看看asList的源码 我以为返回了个n...

  • Arrays.asList()是个坑

    在java语言中,把数组转换成List集合,有个很方便的方法就是 如果你之前没有对返回来 list 进行操作(ad...

  • Arrays.asList 有坑嘛?

    先来看下 阿里巴巴 Java 开发手册中: 【强制】使用工具类 Arrays.asList()把数组转换成集合时...

  • List的10个坑

    一、Arrays.asList转换基本类型数组的坑 1.1 问题展示 在实际的业务开发中,我们通常会进行数组转Li...

  • Arrays.asList(T... a)方法的坑

    踩了一个小坑,今天记录下来 先看代码吧 会有问题吗?很遗憾,remove这行会直接抛出异常 Exception i...

网友评论

    本文标题:Arrays.asList的坑

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