你連存活到JDK8中著名的Bug都不知道,我怎麼敢給你加薪
1 背景
在筆者研究 JDK 原始碼時,注意到在CopyOnWriteArrayList 和ArrayList 的構造器中都出現瞭如下 bug 字樣
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();
}
}
父類陣列中每一個元素都是子類物件,所以如下所示,這種向上轉型不會報錯
允許子類陣列轉換成父類陣列。
但陣列中元素型別都是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)。
通過if判斷,避免錯誤的陣列型別儲存異常。
Arrays.copyOf(elementData, size, Object[].class)
即可確保建立得到Object[]陣列,因此可以存任意型別物件。
相關文章
- 面試官:你連RESTful都不知道我怎麼敢要你?面試REST
- 你知道著名的3畫素Bug指的是什麼嗎?怎麼解決呢?
- CopyOnWriteArrayList你都不知道,怎麼拿offer?
- 領導說“我都不知道你擅長什麼”
- 你前端都只是半桶水而已,你還敢問我怎麼學後端?前端後端
- 【AI 全棧 SOTA 綜述 】這些你都不知道,怎麼敢說會 AI?【語音識別原理 + 實戰】AI全棧
- 起訴書!慕課網你敢抄襲,我就敢起訴你!
- 藍芽耳機千萬不要這樣用?不然你的聽力怎麼損傷你都不知道!藍芽
- 正則匹配身份證有bug你知道麼?
- Android:單機版的“你畫我猜”你敢信?(Path的使用)Android
- 你肯定連變數都不會變數
- 校園儲存雲盤,你知道怎麼選擇嗎?
- 這些著名資料庫之間的“關係”,你知道嗎?資料庫
- Android點將臺:你敢摸我貓 [- IPC -]Android
- 面試題:你工作中碰到的印象比較深的 bug,你怎麼處理的?面試題
- 塊儲存是做什麼用的,你知道嗎?
- 你應該知道的前端--儲存前端
- 你真的知道Python的字串怎麼用嗎?Python字串
- 這樣你都不懂Promise,算我輸!Promise
- 給你5個億,你怎麼做廣告投放?
- 糟糕,你寫的 BUG 要被存1000年了!
- 你知道嗎,Java之父也討厭BugJava
- mysql中的date、datetime、timestamp你還不知道怎麼使用嗎MySql
- Dart | 你知道 sync*/async* 是怎麼用的嗎?Dart
- 你真的知道協程是怎麼來的嗎?
- 敢曬出你的桌面嗎?
- 老王,你給我說說 Laravel 的請求是怎麼到達控制器的Laravel
- 你的員工幹什麼你知道嗎
- 有關連結串列的小技巧,我都給你總結好了
- 你知道MySQL的LRU連結串列嗎?MySql
- Redis為什麼快?你只知道單執行緒和基於記憶體?抱歉我不能給你offer...Redis執行緒記憶體
- PHP中的構造方法和析構方法你知道怎麼用了嗎?PHP構造方法
- 怎麼知道你跟對了人 No.176
- 聚合支付代理是怎麼賺錢的,你知道嗎?
- 談談Spring中的物件跟Bean,你知道Spring怎麼建立物件的嗎?Spring物件Bean
- 你知道Golang的模板怎麼用嗎?帶你瞭解動態文字的生成!Golang
- 你連 HTTPS 原理都不懂?就別講“中間人攻擊”!HTTP
- 說說你遇到過最大的bug是什麼?怎麼解決的?