<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 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      618 隨筆 :: 87 文章 :: 225 評(píng)論 :: 0 Trackbacks
    今天發(fā)現(xiàn)單獨(dú)的將一個(gè)ArrayList的對(duì)象添加到另外一個(gè)ArrayList的時(shí)候,總是源列表和目的列表相同的內(nèi)存地址。原因如下:

    偶然看到了Collections的copy(List desc,List src)方法.當(dāng)時(shí)就想這個(gè)方法和初始化一個(gè)List desc=new ArrayList(List c)【參數(shù)必須實(shí)現(xiàn)Collection接口】的區(qū)別。

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

    所以使用了Collections.copy()方法來(lái)進(jìn)行拷貝,但是這樣就接觸到了此方法所報(bào)出的異常:

    使用后者進(jìn)行拷貝的結(jié)果是:當(dāng)你的desc鏈表發(fā)生改變時(shí),src也將會(huì)隨之改變。
    使用前者進(jìn)行拷貝時(shí)你又必須要注意目標(biāo)鏈表的長(zhǎng)度必須要比源鏈表的長(zhǎng)度大或者相等。

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

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

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

    使用這位仁兄的方法,我這邊一直報(bào)錯(cuò)說(shuō)找不到此構(gòu)造函數(shù),估計(jì)是因?yàn)槲沂褂昧薺dk6的原因,后來(lái)使用了替代方法,用apache的CollectionUtils:

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


    posted on 2009-10-27 16:24 seal 閱讀(10110) 評(píng)論(4)  編輯  收藏 所屬分類(lèi): Java基礎(chǔ)

    評(píng)論

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

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

    博主可以再確認(rèn)一下。  回復(fù)  更多評(píng)論
      

    # re: 慎用java.util.Collections.copy()方法 2011-08-03 15:28 金環(huán)三結(jié)
    2樓說(shuō)的對(duì),Collections.copy(dest, src);也是淺拷貝  回復(fù)  更多評(píng)論
      

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

    主站蜘蛛池模板: 日韩亚洲产在线观看| 奇米影视亚洲春色| 337p日本欧洲亚洲大胆裸体艺术| 亚洲日韩精品无码AV海量| 免费无码看av的网站| 国产成人亚洲精品播放器下载| 国产男女猛烈无遮挡免费视频网站| 亚洲国产精品无码久久| 免费黄网在线观看| 猫咪免费人成在线网站| 亚洲精品成人网久久久久久| 中文字幕的电影免费网站| 亚洲电影中文字幕| 成视频年人黄网站免费视频| 亚洲一区二区三区精品视频| 日韩在线视频免费看| 十八禁的黄污污免费网站| 在线观看午夜亚洲一区| 美女在线视频观看影院免费天天看 | 国产亚洲一区区二区在线| 毛片免费在线观看网站| 亚洲中文无码永久免费| 亚洲成网777777国产精品| 一个人看www免费高清字幕| 亚洲AV无码精品无码麻豆| 久久经典免费视频| 国产亚洲精品91| 亚洲国产精品无码久久久蜜芽 | 亚洲人成人77777在线播放| 日韩免费a级毛片无码a∨| 国产精品日本亚洲777| 久久久青草青青国产亚洲免观| 久久青草国产免费观看| 精品丝袜国产自在线拍亚洲| 啊灬啊灬别停啊灬用力啊免费看| baoyu116.永久免费视频| 亚洲国产成人综合| 亚洲精品国产精品乱码不卞| 免费A级毛片无码A∨中文字幕下载| 亚洲色最新高清av网站| 亚洲精品无码专区久久久 |