关于 ArrayList.toArray() 和 Arrays.asList().toArray()方法

1.ArrayList.toArray() 理解
    * 通过源码我们可以看到返回的是Object类型的数组,失去了原有的实际类型,虽然底层存储是具体类型的对象,这也正体现了文档中说的:该方法起到了bridge的作用(This method acts as bridge between array-based and collection-based APIs)。

#ArrayList.toArray()源码
public Object[] toArray() {
    return Arrays.copyOf(elementData, size);
}

2.Arrays.asList().toArray()理解
    * 工具类Arrays的asList()方法实际中经常会用到,用于把指定的对象包装成一个固定大小的对象数组,但是其返回的ArrayList是其内部类,不同于java.util.ArrayList

#Arrays.asList().toArray()源码
public static <T> List<T> asList(T... a) {
    return new ArrayList<>(a);
}

/**
 * @serial include
 */
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) {
        a = Objects.requireNonNull(array);
    }

    @Override
    public int size() {
        return a.length;
    }

    @Override
    public Object[] toArray() {
        return a.clone();
    }
    .........
}

这里虽然我们看到 toArray 方法返回的依然是 Object[],但是与 java.util.ArrayList 不同的是这里底层存储是泛型类型的数组 private final E[] a,所以保留了实际的类型.

转自《https://zhuanlan.zhihu.com/p/25302618》

 

posted @ 2017-07-11 15:15  PoleStar  阅读(1209)  评论(0编辑  收藏  举报