zoukankan      html  css  js  c++  java
  • Arrays.asList的用法

    使用工具类Arrays.asList()把数组转换成集合时,不能使用其修改集合相关的方法,它的add/remove/clear方法会抛出UnsupportOperationException异常
    说明:asList的返回对象是一个Arrays内部类,并没有实现集合的修改方法。Arrays.asList体现的是适配器模式,只是转换接口,后台的数据仍是数组。
    String[] str = new String[]{"1","2"};
    List list = Arrays.asList(str);
    第一种情况:list.add("x");//运行时异常
    第二种情况:str[0] = "unv";//那么list.get(0)也随着修改。
    此类包含用来操作数组(比如排序和搜索)的各种方法。此类还包含一个允许将数组作为列表来查看的静态工厂。 除非特别注明,否则如果指定数组引用为 null,则此类中的方法都会抛出 NullPointerException。一段有意思的代码如下:
    Java代码 

    public static void main(String[] args) {

    int[] data = {1,2,3,4,5};

    List list = Arrays.asList(data);

    System.out.println("列表中的元素数量是:" + list.size());

    }

    注意这里输出的数量是1,原因是,在Arrays.asList中,该方法接受一个变长参数,一般可看做数组参数,但是因为int[] 本身就是一个类型,所以data变量作为参数传递时,编译器认为只传了一个变量,这个变量的类型是int数组,所以size为1。基本类型是不能作为泛型的参数,按道理应该使用包装类型,但这里缺没有报错,因为数组是可以泛型化的,所以转换后在list中就有一个类型为int的数组
    Java代码 复制代码收藏代码Arrays类鈥斺擜rrays.asList()方法使用

    int[] data = {1,2,3,4,5};

    List list = Arrays.asList(data);

    System.out.println("元素类型:" + list.get(0).getClass());

    System.out.println("前后是否相等:"+data.equals(list.get(0)));

    可以看到,
    输出的为元素类型:class [I
    前后是否相等:true
    因为jvm不可能输出array类型,array类型属于java.lang.reflect包,通过反射访问数组的这个类,编译时候生成的。所以要改为:
    Java代码 复制代码收藏代码Arrays类鈥斺擜rrays.asList()方法使用

    Integer[] data = {1,2,3,4,5};

    List list = Arrays.asList(data);

    System.out.println("列表中的元素数量是:" + list.size());

    输出结果:
    列表中的元素数量是:5

    说明编译器对Integer[] 处理不一样。Integer是可变长参数。传入过程中asList()方法实际是将Integer数组里的元素进行存储。

    此外,假如如下代码:
    Java代码 复制代码收藏代码Arrays类鈥斺擜rrays.asList()方法使用

    //枚举,声明一个星期

    enum Week{Sun,Mon, Tue, Wed,Thu,Fri,Sat}

    public static void main(String[] args) {

    //工作日

    Week[] workDays = {Week.Mon, Week.Tue, Week.Wed,Week.Thu,Week.Fri};

    //转换为列表

    List list = Arrays.asList(workDays);

    //增加周六也为工作日

    list.add(Week.Sat);

    注意这里用add会出错,因为是arrays.aslist中,看代码可以看到这里返回的ArrayList不是原来的传统意义上的java.util.arraylist了,而是自己工具类的一个静态私有内部类,并没有提供add方法,要自己实现,所以这里是出错了,因此,除非确信array.aslist后长度不会增加,否则谨慎使用:List abc=Arrays.asList("a","b","c"),因为这样的长度是无法再add的了.
  • 相关阅读:
    es5预览本地文件、es6练习代码演示案例
    Java实现 LeetCode 838 推多米诺(暴力模拟)
    Java实现 LeetCode 838 推多米诺(暴力模拟)
    Java实现 LeetCode 838 推多米诺(暴力模拟)
    Java实现 LeetCode 837 新21点(DP)
    Java实现 LeetCode 837 新21点(DP)
    Java实现 LeetCode 837 新21点(DP)
    Java实现 LeetCode 836 矩形重叠(暴力)
    Subversion under Linux [Reprint]
    Subversion how[Reprint]
  • 原文地址:https://www.cnblogs.com/hoobey/p/6661294.html
Copyright © 2011-2022 走看看