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

简介: 你连存活到JDK8中著名的Bug都不知道,我怎么敢给你加薪

1 背景

在笔者研究 JDK 源码时,注意到在CopyOnWriteArrayList 和ArrayList 的构造器中都出现了如下 bug 字样

1.png

image.png

6260652 其实代表的JDK bug 列表中的编号


http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6260652

http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6515694

上面两个 bug 其实是同一个问题。那他到底意味着什么呢,JDK 居然将此 bug 留在 8 了还没处理?

看几个例子:

2 案例

2.1 案例一

package com.javaedge;
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();
    }
}

父类数组中每一个元素都是子类对象,所以如下所示,这种向上转型不会报错

3.png

允许子类数组转换成父类数组。

但数组中元素类型都是Child型,所以如下所示,会报错!!!

4.png

java.lang.ArrayStoreException

表明已经尝试作出了错误类型的对象存储到对象的数组。

例如,下面的代码生成一个ArrayStoreException

5.png

这意味着Object[]数组,并不表示可以随便将一个Object对象放进去,而取决于数组中元素的实际类型。

2.2 案例二

6.png

List list = Arrays.asList("JavaEdge"); // 返回的类型是java.util.Arrays$ArrayList,而不是ArrayList

Object[] objects = list.toArray(); // 返回String[]数组


所以我们不能将Object对象,放到objects数组。

2.3 案例三

7.png

ArrayList的toArray()返回Object[]数组,所以可将任意对象存入 list2Array 数组。

3 总结

通过案例二和三可以得出结论:

对于


List stringList


当调用


Object[] objectArray = stringList.toArray()


objectArray 实际上并不一定是Object[]类型,也就不能随便放进一个对象。


所以开头中的源码都有注释说明:


c.toArray might (incorrectly) not return Object[] (see 6260652)。


通过if判断,避免错误的数组类型存储异常。


Arrays.copyOf(elementData, size, Object[].class)


即可确保创建得到Object[]数组,因此可以存任意类型对象。


目录
相关文章
|
4月前
|
缓存 安全 Java
JDK8线程池BUG引发的思考
JDK8线程池BUG引发的思考
134 0
|
4月前
|
Java Maven
[Java ] jdk升级 bug java: -source 8 中不支持 instanceof 中的模式匹配 (请使用 -source 16 或更高版本以启用 instanceof 中的模式匹配)
[Java ] jdk升级 bug java: -source 8 中不支持 instanceof 中的模式匹配 (请使用 -source 16 或更高版本以启用 instanceof 中的模式匹配)
344 0
|
10月前
|
Arthas NoSQL Java
JDK11现存性能bug(JDK-8221393)深度解析(1)
作为一名工程师,面对上面的现象,你会怎么做? 我想你的第一反应肯定是业务代码有问题?是不是有什么地方导致内存泄露? 是不是业务代码里有什么地方加载的数据太多,越来越慢?…… 同事尝试过dump堆里的内容,dump jstak线程…… 都没看出来什么异常,也优化了业务代码里之前一些不合理的逻辑,始终没有解决问题。 当时的问题是他们都没有往热点代码的方向排查,主要是因为他们不知道有啥好用的工具。
112 0
|
10月前
|
Java 开发者
JDK11现存性能bug(JDK-8221394)深度解析(2)
当然这个bug的本质就是jdk11+zgc+StackWalker的bug,三者都是bug触发的必要条件,如果你能避免其中一条就可以完美避开这个bug了,比如升级到jdk12+,比如不用zgc……
138 0
|
消息中间件 存储 Arthas
MQ-消息堆积-JDK Bug导致线程阻塞案例分析
一个JDK BUG导致系统LOAD高的案例分析
180 0
|
缓存 安全 Java
JDK8线程池BUG引发的思考
这里先说明一下这篇文章的相关知识点直接进行一个总结,如果读者对于相关内容十分熟悉的话这里也不浪费各位的时间,可以直接关闭本文了(哈哈)
116 0
|
Ubuntu Java
上报的关于JDK dpi/resolution错误的BUG已正式确认
上报的关于JDK dpi/resolution错误的BUG已正式确认
63 0
太极限了,JDK的这个BUG都能被我踩到
之前遇到个文件监听变更的问题,刚好这周末有空研究了一番,整理出来分享给大家。 从一次故障说起 我们还是从故障说起,这样更加贴近实际,也能让大家更快速理解背景。 有一个下发配置的服务,这个配置服务的实现有点特殊,服务端下发配置到各个服务的本地文件,当然中间经过了一个agent,如果没有agent也就无法写本地文件,然后由client端的程序监听这个配置文件,一旦文件有变更,就重新加载配置,画个架构图大概是这样:
|
Arthas 缓存 Kubernetes
JFR定位由于可能的JDK11的bug导致Log4j2 CPU占用100%的问题
JFR定位由于可能的JDK11的bug导致Log4j2 CPU占用100%的问题
JFR定位由于可能的JDK11的bug导致Log4j2 CPU占用100%的问题
|
安全 Java 程序员
JDK8线程池BUG引发的思考(下)
JDK8线程池BUG引发的思考(下)
242 0