java数组转换为List注意地方详解编程语言

我们经常需要使用到Arrays这个工具的asList()方法将其转换成列表。方便是方便,但是有时候会出现莫名其妙的问题。如下:

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,是的你没有看错, 结果就是1。但是为什么会是1而不是5呢?先看asList()的源码

public static <T> List<T> asList(T… a) {

        return new ArrayList<T>(a);

    }

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

我们在看下面程序:

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<Week> list = Arrays.asList(weeks);

        list.add(Week.Sat);

    }

这个程序非常简单,就是讲一个数组转换成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 <T> List<T> asList(T… a) {

        return new ArrayList<T>(a);

    }

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

private static class ArrayList<E> extends AbstractList<E>

    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()方法,那么查看父类:

public boolean add(E e) {

    add(size(), e);

    return true;

    }

    public void add(int index, E element) {

    throw new UnsupportedOperationException();

    }

这里父类仅仅只是提供了方法,方法的具体实现却没有,所以具体的实现需要子类自己来提供,但是非常遗憾

这个内部类ArrayList并没有提高add的实现方法。在ArrayList中,它主要提供了如下几个方法:

1、size:元素数量

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

3、get:获得指定元素。

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

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

java数组转换为List注意地方详解编程语言

转载请注明来源网站:blog.ytso.com谢谢!

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/14867.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论