你連存活到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
- CopyOnWriteArrayList你都不知道,怎麼拿offer?
- 領導說“我都不知道你擅長什麼”
- 你前端都只是半桶水而已,你還敢問我怎麼學後端?前端後端
- 【AI 全棧 SOTA 綜述 】這些你都不知道,怎麼敢說會 AI?【語音識別原理 + 實戰】AI全棧
- 藍芽耳機千萬不要這樣用?不然你的聽力怎麼損傷你都不知道!藍芽
- “嘿,機器,你是怎麼做好翻譯的呀?” “來,我畫給你看!”
- 校園儲存雲盤,你知道怎麼選擇嗎?
- 你肯定連變數都不會變數
- Android:單機版的“你畫我猜”你敢信?(Path的使用)Android
- 面試題:你工作中碰到的印象比較深的 bug,你怎麼處理的?面試題
- 塊儲存是做什麼用的,你知道嗎?
- 這些著名資料庫之間的“關係”,你知道嗎?資料庫
- 這樣你都不懂Promise,算我輸!Promise
- 你應該知道的前端--儲存前端
- Android點將臺:你敢摸我貓 [- IPC -]Android
- 你真的知道Python的字串怎麼用嗎?Python字串
- Dart | 你知道 sync*/async* 是怎麼用的嗎?Dart
- 你需要知道的Xcode Debug功能XCode
- 老王,你給我說說 Laravel 的請求是怎麼到達控制器的Laravel
- 我不知道你知不知道我知道的偽元素小技巧
- 模式15:我給了你鑿子,可你為什麼不是米開朗基羅模式
- PHP中的構造方法和析構方法你知道怎麼用了嗎?PHP構造方法
- 面試官:你知道怎麼求素數嗎?面試
- 聚合支付代理是怎麼賺錢的,你知道嗎?
- 你知道Ctrl+Alt+Delete是怎麼來的嗎?delete
- 你知道嗎,Java之父也討厭BugJava
- Redis為什麼快?你只知道單執行緒和基於記憶體?抱歉我不能給你offer...Redis執行緒記憶體
- 你知道Golang的模板怎麼用嗎?帶你瞭解動態文字的生成!Golang
- [老闆我可以加薪嗎?]手把手教你加薪怎麼談,絕對乾貨··
- 你知道MySQL的LRU連結串列嗎?MySql
- 程式設計師之怒:敢騙我?我親手黑了你電腦,把你送進去!程式設計師
- 有關連結串列的小技巧,我都給你總結好了
- 第三方介面 駭客怎麼愛你都不嫌多
- 換人!golang面試官:連怎麼避免記憶體逃逸都不知道?Golang面試記憶體
- 面試官:換人,他怎麼連 GET 和 POST 區別都不知道?面試
- mysql中的date、datetime、timestamp你還不知道怎麼使用嗎MySql
- 給你一個Demo 看看這時你要怎麼快速定位ANR?