数组和ArrayList

本文详细解析了Java中数组与List之间的转换方式,并对比了不同方法的优劣。介绍了使用Arrays.asList()转换时的限制,以及如何高效地将数组转换为ArrayList。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 先看一下相关的结果或函数。

①ArrayList.subList是ArrayList的一个内部类,不可以强转成成ArrayList,否则会抛出ClassCastException异常,即 java.util.RandomAccessSubList cannot be cast to java.util.ArrayList,是ArrayList 的一个视图,对于 SubList 子列表的所有操作最终会反映到原列表上。

②Arrays.asList返回的是一个 Arrays 内部类,是固定大小的一个list,使用相关的add、remove、clear等方法会产生UnsupportedOperationException异常。

③ArrayList.toArray返回的是Object[],而ArrayList.toArray(T[] a)返回的是一个传入参数一样大小和类型的数组。

1.数组转List

①直接是用Arrays.asList肯定是错误,转成的List不能操作

ArrayList arrayList = new ArrayList(Arrays.asList(array));

使用这种方法,除了asList中的创建list,还会将List转数组再复制到ArrayList的数组中,因为多了两次的操作,所以这种方法效率低。

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;
    }
}

③创建一个空的ArrayList,循环把数组的元素add进去,这样子只是直接加到list中,没有把其他多余操作,这是我们自己实现的代码。

Element[] elements = new Element[10];
List<Element> list = new ArrayList<>(elements.length);
for(Element element:elements){
	list.add(element);
} 

其实Collections中已经帮我们实现了代码,很简洁,很漂亮的代码。

@SafeVarargs
public static <T> boolean addAll(Collection<? super T> c, T... elements) {
    boolean result = false;
    for (T element : elements)
        result |= c.add(element);
    return result;
}

在ArrayList的源码中,add(E e)方法只会返回true,所以对于ArrayList来说result只会是true。

public boolean add(E e) {
    ensureCapacityInternal(size + 1);  // Increments modCount!!
    elementData[size++] = e;
    return true;
}

至于ArrayList转数组,阿里巴巴Java开发规范中有详细的解释。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值