在 学习 JAVA ArrayList 源码时,看到 ArrayList 带参数的构造方法中有
c.toArray might (incorrectly) not return Object[] (see 6260652)
一句这样的注释,不明白什么意思所以深入看了一下,原来是 Java 中的一个 BUG
https://bugs.java.com/bugdatabase/view_bug.do?bug_id=6260652直接贴代码吧!
public static void main(String[] args) {
/**
* java BUG: c.toArray might (incorrectly) not return Object[] (see 6260652)
*/
List<String> stringList = new ArrayList();
stringList.add("A");
// 调用 ArrayList 中的 toArray() 方法会返回一个新的 Object[] 类型
Object[] listArray = stringList.toArray(); // class [Ljava.lang.Object'
listArray[0] = new Object();
/**************************************************************************/
List<String> asList = Arrays.asList("A", "B");
// 调用 Arrays 类中的 toArray() 方法,实际返回的是 Object 类型的引用,而实际类型还是 String 类型
Object[] objects = asList.toArray(); // class [Ljava.lang.String;
objects[0] = new Object(); // java.lang.ArrayStoreException
}
如上所示,同样都是调用的 toArray() 方法,但是它们之间的实现方式是有差别的。
第一种调用了 java.util.ArrayList 中的 toArray() 方法:
public Object[] toArray() {
return Arrays.copyOf(elementData, size);
}
第二种调用了 java.util.Arrays 中的 toArray() 方法:
public Object[] toArray() {
return a.clone();
}
具体的实现细节可以自行查看源码,本文只作为自己的学习笔记,以便日后复盘。