阿里巴巴|你连存活到JDK8中著名的Bug都不知道,我怎么敢给你加薪


阿里巴巴|你连存活到JDK8中著名的Bug都不知道,我怎么敢给你加薪
文章图片
阿里巴巴|你连存活到JDK8中著名的Bug都不知道,我怎么敢给你加薪
文章图片
阿里巴巴|你连存活到JDK8中著名的Bug都不知道,我怎么敢给你加薪
文章图片
阿里巴巴|你连存活到JDK8中著名的Bug都不知道,我怎么敢给你加薪
文章图片
阿里巴巴|你连存活到JDK8中著名的Bug都不知道,我怎么敢给你加薪
文章图片
1 背景在笔者研究 JDK 源码时 , 注意到在CopyOnWriteArrayList 和ArrayList 的构造器中都出现了如下 bug 字样
上面两个 bug 其实是同一个问题 。 那他到底意味着什么呢 , JDK 居然将此 bug 留在 8 了还没处理?
看几个例子:
2 案例2.1 案例一
package com.msb;

public class Test {
public static void main(String[
args) {
Child[
childArray = {new Child() new Child();
System.out.println(childArray.getClass());

Father[
fatherArray = childArray;
System.out.println(fatherArray.getClass());

// ArrayStoreException
fatherArray[0
= new Father();



父类数组中每一个元素都是子类对象 , 所以如下所示 , 这种向上转型不会报错
允许子类数组转换成父类数组 。
但数组中元素类型都是Child型 , 所以如下所示 , 会报错!!!
java.lang.ArrayStoreException

表明已经尝试作出了错误类型的对象存储到对象的数组 。
例如 , 下面的代码生成一个ArrayStoreException
这意味着Object[
数组 , 并不表示可以随便将一个Object对象放进去 , 而取决于数组中元素的实际类型 。
2.2 案例二
List<String> list = Arrays.asList(\"JavaEdge\"); // 返回的类型是java.util.Arrays$ArrayList , 而不是ArrayList
Object[
objects = list.toArray(); // 返回String[
数组
所以我们不能将Object对象 , 放到objects数组 。
2.3 案例三
ArrayList的toArray()返回Object[
数组 , 所以可将任意对象存入 list2Array 数组 。
3 总结通过案例二和三可以得出结论:
对于
List<String> stringList
当调用
Object[
objectArray = stringList.toArray()

objectArray 实际上并不一定是Object[
类型 , 也就不能随便放进一个对象 。
所以开头中的源码都有注释说明:
c.toArray might (incorrectly) not return Object[
(see 6260652) 。
【阿里巴巴|你连存活到JDK8中著名的Bug都不知道,我怎么敢给你加薪】通过if判断 , 避免错误的数组类型存储异常 。
Arrays.copyOf(elementData size Object[
.class)
即可确保创建得到Object[
数组 , 因此可以存任意类型对象 。
其实这也是为什么在现在的面试中越来越多的人会询问源码的相关内容 , 其实说白了 , 除了社会的进步之外 , 更多的就是为了能够在工作过程中能够更好的解决遇到的问题 ,


推荐阅读