阿里巴巴|你连存活到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[【阿里巴巴|你连存活到JDK8中著名的Bug都不知道,我怎么敢给你加薪】通过if判断 , 避免错误的数组类型存储异常 。
(see 6260652) 。
Arrays.copyOf(elementData size Object[即可确保创建得到Object[
.class)
数组 , 因此可以存任意类型对象 。
其实这也是为什么在现在的面试中越来越多的人会询问源码的相关内容 , 其实说白了 , 除了社会的进步之外 , 更多的就是为了能够在工作过程中能够更好的解决遇到的问题 ,
- 阿里巴巴|反击开始!马云、马化腾、任正非相继出手,网友炸锅:干得漂亮
- 阿里巴巴|电商风云再起?拼多多来势汹汹,疯狂攻击阿里“命门”!
- 阿里巴巴|好戏还在后面!英国尝到“苦头”,美国表态:不关我的事
- 阿里巴巴|你觉得华为与阿里巴巴,谁掌握的世界性先进技术比更多?
- 阿里巴巴|马云不再沉默,面对印度的施压,阿里直接遣散印度公司员工
- 阿里巴巴|全球区块链发明专利排行榜:阿里腾讯浪潮包揽前三,中国企业占46%
- 阿里巴巴|追赶蚂蚁金服,马云又一张王牌崛起,估值930亿美金,年收入400亿
- 华为|美团抨击阿里巴巴,是想打造自己的生态圈?网友:大不了不用了
- 阿里巴巴|研究性学的、搞导弹的、种菜的都来了,阿里到底有多少“跨界神人”?
- 阿里巴巴|又一次押宝中国!孙正义豪投140亿,打造第二个阿里?现千亿估值