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;
影响
public class Test {
public static void main(String[] args) {
String[] arr = new String[]{"a", "b", "c"};
Object[] arr2 = Arrays.asList(arr).toArray();
arr2[0] = 1;
}
}
编译不会有问题,但是执行会发生错误(ArrayStoreException)
Exception in thread "main" java.lang.ArrayStoreException: java.lang.Integer