一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - JDK1.6集合框架bug 6260652解析

JDK1.6集合框架bug 6260652解析

2021-01-28 12:13aitangyong Java教程

這篇文章主要為大家解析了JDK1.6集合框架bug:c.toArray might (incorrectly) not return Object[] (see 6260652),具有一定的參考價值,感興趣的小伙伴們可以參考一下

最近在看JDK的源碼:CopyOnWriteArrayList.java和ArrayList.java,這2個類的構造函數,注釋中有一句話看不懂。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public ArrayList(Collection<? extends E> c) {
elementData = c.toArray();
size = elementData.length;
// c.toArray might (incorrectly) not return Object[] (see 6260652)
if (elementData.getClass() != Object[].class)
  elementData = Arrays.copyOf(elementData, size, Object[].class);
}
 
public CopyOnWriteArrayList(Collection<? extends E> c) {
Object[] elements = c.toArray();
// c.toArray might (incorrectly) not return Object[] (see 6260652)
if (elements.getClass() != Object[].class)
  elements = Arrays.copyOf(elements, elements.length, Object[].class);
setArray(elements);
}

上網查了一下資料,才知道see 6260652 這個編號代表JDK bug庫中的編號??梢匀ス倬W查看bug詳情
http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6260652
http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6515694
6260652 和6515694這2個bug,貌似是同一個問題。這個bug是什么意思呢?我們先來看看一些測試代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
public static void test1()
{
  SubClass[] subArray = {new SubClass(), new SubClass()};
  System.out.println(subArray.getClass());
 
  // class [Lcollection.SubClass;
  BaseClass[] baseArray = subArray;
  System.out.println(baseArray.getClass());
 
  // java.lang.ArrayStoreException
  baseArray[0] = new BaseClass();
}
 
public static void test2()
{
  List<String> list = Arrays.asList("abc");
 
  // class java.util.Arrays$ArrayList
  System.out.println(list.getClass());
 
  // class [Ljava.lang.String;
  Object[] objArray = list.toArray();
  System.out.println(objArray.getClass());
 
  objArray[0] = new Object(); // cause ArrayStoreException
}
 
public static void test3()
{
  List<String> dataList = new ArrayList<String>();
  dataList.add("one");
  dataList.add("two");
 
  Object[] listToArray = dataList.toArray();
 
  // class [Ljava.lang.Object;返回的是Object數組
  System.out.println(listToArray.getClass());
  listToArray[0] = "";
  listToArray[0] = 123;
  listToArray[0] = new Object();
   
}

1、關于test1()

 SubClass 繼承自BaseClass,由于SubClass數組中每一個元素都是SubClass對象,所以BaseClass[] baseArray = subArray;這種強制類型轉換不會報錯。這其實就是java對象的向上轉型,子類數組轉換成父類數組是允許的。但是由于數組中元素類型都是SubClass類型的,所以 baseArray[0] = new BaseClass();會報錯java.lang.ArrayStoreException。這也就是說假如我們有1個Object[]數組,并不代表著我們可以將Object對象存進去,這取決于數組中元素實際的類型。

2、關于test2()

List<String> list = Arrays.asList("abc");需要注意,可以知道返回的實際類型是java.util.Arrays$ArrayList,而不是ArrayList。我們調用

Object[] objArray = list.toArray();返回是String[]數組,所以我們不能將Object對象,放到objArray數組中。

3、關于test3()

ArrayList對象的toArray()返回就是Object[]數組,所以我們可以將任意對象存放到返回的Object[]數組中。

通過test2和test3可以看出,如果我們有1個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);這個方法就是用來創建1個Object[]數組,這樣數組中就可以存放任意對象了。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:http://blog.csdn.net/aitangyong/article/details/30274749

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 色悠久久久久综合欧美99 | 国产成人精品视频一区二区不卡 | 99国产精品免费观看视频 | yin娃sao货调教情趣用品店 | 国产午夜精品一区二区三区不卡 | 国产日韩欧美在线一二三四 | 成人高清网站 | 69av免费视频 | 男人把大ji巴放进女人小说 | 女人爽到喷水的视频免费 | 视频网站入口在线看 | 日韩高清一区二区 | 天天爱综合网 | 高清国产精品久久久久 | 国产精品四虎在线观看免费 | 视频在线视频免费观看 | 国产精品第四页 | 国产rpg迷雾之风冷狐破解 | 久久精品中文闷骚内射 | 久久国产热视频99rev6 | 91伊人网| 精品国产欧美一区二区五十路 | 高跟丝袜麻麻求我调教 | 亚洲好视频 | 日本在线小视频 | 国产裸舞福利资源在线视频 | 国产欧美一区二区精品性色99 | 国产一区二区三区福利 | a级毛片毛片免费观看永久 a级黄色片免费 | 午夜AV内射一区二区三区红桃视 | 日本道在线播放 | 好吊色网站 | 国产欧美日韩精品在线 | 国产精品女主播自在线拍 | 肉大捧一进一出视频免费播放 | 欧美一级高清免费a | 国产在线乱子伦一区二区 | 丝袜老师好湿好紧我要进去了 | 性啪啪chinese东北女人 | 奇米影视在线观看 | 日韩高清无砖砖区2022 |