栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Arrays.asList()注意事项

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Arrays.asList()注意事项

Arrays是一个工具方法,其asList(T..a)方法可以将数组转为集合List,但使用该方法有以下两点需要注意:

(1)元素个数

public static void main(String[] args) {
        int[] datas = new int[]{1,2,3,4,5};
        List list = Arrays.asList(datas);
        System.out.println(list.size());
    }

------------Output:
1


为什么会是1而不是5呢?先看asList()的源码:

public static  List asList(T... a) {
        return new ArrayList(a);
    }


注意这个参数:T…a,这个参数是一个泛型的变长参数(可传入多个参数),我们知道基本数据类型是不可能泛型化的,也是就说8个基本数据类型是不可作为泛型参数的,但是为什么编译器没有报错呢?这是因为在java中,数组会被当做一个对象来处理,它是可以泛型的,所以我们的程序是把一个int型的数组作为了T的类型,所以在转换之后List中就只会存在一个类型为int数组的元素了。所以我们这样的程序System.out.println(datas.equals(list.get(0)));输出结果肯定是true。如果将int改为Integer,则长度就会变成5了。

(2)我们再看下面程序:

enum Week{Sum,Mon,Tue,Web,Thu,Fri,Sat}
    public static void main(String[] args) {
        Week[] weeks = {Week.Sum,Week.Mon,Week.Tue,Week.Web,Week.Thu,Week.Fri};
        List list = Arrays.asList(weeks);//返回的是Arrays工具类的内部类ArrayList,而不是java.util.ArrayList,其是一个长度不可变的集合
        list.add(Week.Sat);//内部类ArrayList本身没有提供add(),它的父类提供add()但没有具体实现,所以会报异常
    }


这个程序非常简单,就是讲一个数组转换成list,然后改变集合中值,但是运行呢?

Exception in thread "main" java.lang.UnsupportedOperationException
    at java.util.AbstractList.add(AbstractList.java:131)
    at java.util.AbstractList.add(AbstractList.java:91)
    at com.array.Test.main(Test.java:18)


编译没错,但是运行竟然出现了异常错误!UnsupportedOperationException ,当不支持请求的操作时,就会抛出该异常。从某种程度上来说就是不支持add方法,我们知道这是不可能的!什么原因引起这个异常呢?先看asList()的源代码:

public static  List asList(T... a) {
        return new ArrayList(a);
    }


这里是直接返回一个ArrayList对象返回,但是注意这个ArrayList并不是java.util.ArrayList,而是Arrays工具类的一个内部类:

private static class ArrayList extends AbstractList
    implements RandomAccess, java.io.Serializable{
        private static final long serialVersionUID = -2764017481108945198L;
        private final E[] a;
        ArrayList(E[] array) {
            if (array==null)
                throw new NullPointerException();
        a = array;
    }
       
    }


这个内部类并没有提供add()方法,那么查看父类AbstractList:

public boolean add(E e) {
    add(size(), e);
    return true;
    }
    public void add(int index, E element) {
    throw new UnsupportedOperationException();
    }


这里父类仅仅只是提供了方法,方法的具体实现却没有,希望由子类来具体实现,但是这个内部类ArrayList并没有提供add的实现方法。在Arrays内部类ArrayList中,它主要提供了如下几个方法:

       1、size:元素数量

       2、toArray:转换为数组,实现了数组的浅拷贝。

       3、get:获得指定元素。

       4、contains:是否包含某元素。

       所以综上所述,asList(T..a)返回的是一个长度不可变的列表。数组是多长,转换成的列表是多长,我们是无法通过add、remove来增加或者减少其长度的。
 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/677539.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号