<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Sealyu

    --- 博客已遷移至: http://www.sealyu.com/blog

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      618 隨筆 :: 87 文章 :: 225 評論 :: 0 Trackbacks
    今天發現單獨的將一個ArrayList的對象添加到另外一個ArrayList的時候,總是源列表和目的列表相同的內存地址。原因如下:

    偶然看到了Collections的copy(List desc,List src)方法.當時就想這個方法和初始化一個List desc=new ArrayList(List c)【參數必須實現Collection接口】的區別。

    兩者的差別很大,后者是一個淺拷貝,只是對源list的元素進行拷貝,拷貝的只是引用。拷貝后兩個list的元素(引用)不同,但是引用所指向的對象是一樣的。即是兩個list的每個元素指向的還是通一內存。然而前者是深拷貝,不光拷貝的是src的元素(引用),src內每個元素的所指向的對象都進行一次拷貝。即是兩個list的每個元素所指向的不是同一內存。

    所以使用了Collections.copy()方法來進行拷貝,但是這樣就接觸到了此方法所報出的異常:

    使用后者進行拷貝的結果是:當你的desc鏈表發生改變時,src也將會隨之改變。
    使用前者進行拷貝時你又必須要注意目標鏈表的長度必須要比源鏈表的長度大或者相等。

    舉例如下:
    List src1
    =new ArrayList(3)
    src1.add(
    "a");
    src2.add(
    "b");
    src3.add(
    "c");

    如果你使用下面方法copy鏈表
    /*******************************/
    List des1
    =new ArrayList(3);
    Collections.copy(des1,src1);
    /*******************************/
    將會出錯,拋出數組越界異常。
    當時我怎么想都想不明白為什么,明明已經設置了長度為3,為什么還會出錯!
    后來打印出des1.size()才知道des1的長度為0;3表示的是這個List的容納能力為3,并不是說des1中就有了3個元素。查看api才知道,它的capacity(容納能力大小)可以指定(最好指定)。而初始化時size的大小永遠默認為0,只有在進行add和remove等相關操作時,size的大小才變化。然而進行copy()時候,首先做的是將desc1的size和src1的size大小進行比較,只有當desc1的size 大于或者等于src1的size時才進行拷貝,否則拋出IndexOutOfBoundsException異常。

    所以可以通過下面的方法指定目標desc的大小
    /*******************************/
    List des1
    =new ArrayList(Array.asList(new object[src1.size]));//注意:new ArrayList(Collection col)參數必須要實現Collection 接口。
    Collections.copy(des1,src1);
    /*******************************/
    執行第一句后size的大小是3,其實它是對一個空數組的淺拷貝。

    使用這位仁兄的方法,我這邊一直報錯說找不到此構造函數,估計是因為我使用了jdk6的原因,后來使用了替代方法,用apache的CollectionUtils:

    dest1 = new ArrayList();
    CollectionUtils.addAll(dest1, 
    new Object[src1.size()]);
    Collections.copy(dest1, src1);


    posted on 2009-10-27 16:24 seal 閱讀(10107) 評論(4)  編輯  收藏 所屬分類: Java基礎

    評論

    # re: 慎用java.util.Collections.copy()方法 2010-05-14 14:06 Mavk
    謝謝分享  回復  更多評論
      

    # re: 慎用java.util.Collections.copy()方法 2010-09-29 14:01 shigangxing
    Collections.copy(dest, src);也是淺拷貝,真正的深拷貝需要使用clone()實現。

    博主可以再確認一下。  回復  更多評論
      

    # re: 慎用java.util.Collections.copy()方法 2011-08-03 15:28 金環三結
    2樓說的對,Collections.copy(dest, src);也是淺拷貝  回復  更多評論
      

    # re: 慎用java.util.Collections.copy()方法[未登錄] 2016-08-11 23:39 yf
    樓主誤認。。二樓正解
    是Arrays.asList()....不是Array.asList()  回復  更多評論
      

    主站蜘蛛池模板: 亚洲日韩一区精品射精| 99re6在线精品视频免费播放| 久久久久久国产精品免费免费男同| 国产一区二区三区在线观看免费| 亚洲天堂一区二区三区四区| 免费视频成人手机在线观看网址| AV在线播放日韩亚洲欧| 美女被爆羞羞网站在免费观看| 成人奭片免费观看| 亚洲精品成人久久| 95免费观看体验区视频| 亚洲AV无码一区二区二三区入口| 国产JIZZ中国JIZZ免费看| 少妇亚洲免费精品| 麻豆va在线精品免费播放| 亚洲欧洲日产国码久在线观看 | 亚洲卡一卡二卡乱码新区| 欧洲精品99毛片免费高清观看| 亚洲精品456人成在线| 亚洲日韩精品一区二区三区无码| 99在线热播精品免费99热| 亚洲中文字幕无码爆乳av中文| h片在线免费观看| 亚洲自国产拍揄拍| 国产精品成人免费一区二区| 中文字幕免费人成乱码中国| 国产V亚洲V天堂无码久久久| 99久久久国产精品免费牛牛| 免费看黄网站在线看| 在线A亚洲老鸭窝天堂| 99爱在线观看免费完整版| 特级毛片免费播放| 亚洲性无码AV中文字幕| 亚洲福利精品一区二区三区| 好湿好大好紧好爽免费视频| 亚洲国产成人精品不卡青青草原| 久久久精品2019免费观看| 一级片在线免费看| 337p日本欧洲亚洲大胆色噜噜| 美女视频黄免费亚洲| 亚洲av中文无码字幕色不卡|