Java教程

ArrayList源码解读之集合参数构造方法

本文主要是介绍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;
        }
    }

里面有一句话c.toArray可能返回的不是Object[],感觉很神奇有木有,集合Collection接口定义的返回就是Object[],其他集合实现怎么能不返回Object[]呢?

问题详情

去看了源码标注的BUG才发现真的会有问题,Arrays.asList(x).toArray().getClass()返回的就不是Object[]类型,不过在 Java 9 已经修复了此问题。

public class Test {
    public static void main(String[] args) {
        String[] arr = new String[]{"a", "b", "c"};
        System.out.println(Arrays.asList(arr).toArray().getClass());
    }
}

返回

class [Ljava.lang.String;

切换到高版本jdk,返回就正确了

class [Ljava.lang.Object;
这篇关于ArrayList源码解读之集合参数构造方法的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!