Simple-Java—Collections(二)Java中如何把数组转换为ArrayList

这篇文章主要讨论Stack Overflow上面公选投票最多的一个问题:
如何把下面的数组转换成为一个ArrayList?

Element[] array = {new Element(1),new Element(2),new Element(3)};

1. 点赞最多的答案

最受认可的答案如下:

ArrayList<Element> arrayList = new ArrayList<Element>(Arrays.asList(array));

首先,让我们看一下Java帮助文档中ArrayList的这种带参构造方法的说明

ArrayList(Collection < ? extends E > c) : 构造一个list,用迭代器将指定collection中的元素按顺序放入其中。

这个构造方法的实现过程:
1. 将collection c的元素转换成一个数组
2. 将这个数组复制给ArrayList的成员变量数组“elementData”

源代码:

 public ArrayList(Collection<? extends E> c) {
        elementData = c.toArray();
        if ((size = elementData.length) != 0) {
            // c.toArray might (incorrectly) not return Object[] (see 6260652)
            if (elementData.getClass() != Object[].class)
                elementData = Arrays.copyOf(elementData, size, Object[].class);
        } else {
            // replace with empty array.
            this.elementData = EMPTY_ELEMENTDATA;
        }
    }

2. 点赞第二的答案

排名第二的答案如下:

List<Element> list = Arrays.asList(array);

这不是最佳的答案的原因在于,这个方法返回的list是固定大小的。事实上,它返回的并不是java.util.ArrayList,而是java.util.Arrays中一个私有静态的内部类。我们知道,ArrayList的实现原理是数组,随着元素增多,数组会”扩容”;而asList()返回的是一个固定大小的基础数据类型的数组。如果尝试添加或者删除元素,会抛出UnsupportedOperationException 异常

list.add(new Element(4));

Output:
Exception in thread “main” java.lang.ClassCastException:
java.util.Arrays$ArrayList cannot be cast to java.util.ArrayList
at collection.ConvertArray.main(ConvertArray.java:22)

3. 其他答案

Element[] array = {new Element(1), new Element(2)};
List<element> list = new ArrayList<element>(array.length);
Collections.addAll(list, array);

问题出自:The stackoverflow question link

4. 译者注:问题的小补充

不仅是ArrayList,其余List的子类(LinkList,Vector)也可以用同样的方法实现数组和集合转变

Integer[] array=new Integer[]{1,2,3,4,5};
LinkedList<Integer> linkedList=new LinkedList<Integer>(Arrays.asList(array));
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值