System.arraycopy()實現(xiàn)數(shù)組的復(fù)制與交換

今天在讀別人代碼的時候砚尽,發(fā)現(xiàn)了一個數(shù)組之間復(fù)制很不錯的方法,就分享記錄下吧辉词。同時小小的研究下了它的使用方法必孤。
System提供了一個靜態(tài)方法arraycopy(),我們可以使用它來實現(xiàn)數(shù)組之間的復(fù)制。其函數(shù)原型是:

public static void arraycopy(Object src,
                             int srcPos,
                             Object dest, 
                             int destPos,
                             int length)

src:源數(shù)組瑞躺;
srcPos:復(fù)制源數(shù)組的起始位置敷搪;
dest:目的數(shù)組;
destPos:放置目的數(shù)組的起始位置幢哨;
length:需要復(fù)制的長度赡勘。

注意:src 和 dest都必須是同類型或者可以進行轉(zhuǎn)換類型的數(shù)組。

1.一維數(shù)組的復(fù)制

函數(shù)也很好理解捞镰,直接上代碼吧闸与。

import java.util.Arrays;

public class MyClass {
     public static void main(String[] args) {
         int [] srcArray = new int []{0,1,2,3,4,5,6,7,8} ;
         int [] destArray = new int [srcArray.length] ;
          
         System.arraycopy(srcArray, 0, destArray, 0, srcArray.length) ;
         
         System.out.println(Arrays.toString(srcArray));
         System.out.println(Arrays.toString(destArray));
     }
}

arraycopy()實現(xiàn)復(fù)制

不僅如此,更加有趣的是這個函數(shù)可以實現(xiàn)自己到自己的復(fù)制曼振,比如:

import java.util.Arrays;

public class MyClass {
     public static void main(String[] args) {
         int [] srcArray = new int []{0,1,2,3,4,5,6,7,8} ;
         System.out.println(Arrays.toString(srcArray));
          
         System.arraycopy(srcArray, 0, srcArray , 3, 3) ;
         System.out.println(Arrays.toString(srcArray));
     }
}

則結(jié)果為:

arraycopy()自我復(fù)制

實現(xiàn)過程是這樣的,先生成一個長度為length的臨時數(shù)組,將fun數(shù)組中srcPos到srcPos+length-1之間的數(shù)據(jù)拷貝到臨時數(shù)組中蔚龙,再執(zhí)行System.arraycopy(臨時數(shù)組,0,srcArray ,3,3)冰评。

2.一維數(shù)組的交換

其實從arraycopy()自我復(fù)制的例子就可以想到,只要借助于臨時數(shù)組木羹,就可以實現(xiàn)數(shù)組左邊和右邊的交換甲雅。

import java.util.Arrays;

public class MyClass {
     public static void main(String[] args) {
         int [] srcArray = new int []{0,1,2,3,4,5,6,7,8} ;
         int [] destArray = new int[srcArray.length];
         //從第3位開始數(shù)組左右交換
         int index = 3;

         System.arraycopy(srcArray, index, destArray, 0, srcArray.length-index);
         System.arraycopy(srcArray, 0, destArray, srcArray.length-index, index);

         System.out.println(Arrays.toString(srcArray));
         System.out.println(Arrays.toString(destArray));
     }
}

arraycopy()實現(xiàn)交換

怎么樣,是不是看起來代碼很簡潔坑填,不需要調(diào)用for或者while循環(huán)去實現(xiàn)數(shù)組的交換啦抛人。

3.二維數(shù)組的復(fù)制

由于java沒有二維數(shù)組的概念,平常實現(xiàn)的二維數(shù)組只是元素是一維數(shù)組的一維數(shù)組脐瑰,而數(shù)組也是引用類型妖枚,繼承自O(shè)bject類。數(shù)組是new出來的苍在。這些性質(zhì)也就導致arraycopy()二維數(shù)組會出現(xiàn)問題绝页。這是個坑,不可大意寂恬。怎么樣一個坑呢续誉,我們來對比下一維數(shù)組復(fù)制和二維數(shù)組復(fù)制的代碼你就知道啦。

import java.util.Arrays;

public class MyClass {
     public static void main(String[] args) {
         int [] srcArray = new int []{0,1,2,3,4,5,6,7,8} ;
         int [] destArray = new int [srcArray.length] ;

         System.arraycopy(srcArray, 0, destArray, 0, srcArray.length) ;

         System.out.println("srcArray:"+Arrays.toString(srcArray));
         System.out.println("destArray:"+Arrays.toString(destArray));

         destArray[0] = 9 ;      destArray[1] = 9 ;
         System.out.println("srcArray after changed value:"+Arrays.toString(srcArray));
         System.out.println("destArray after changed value:"+Arrays.toString(destArray));
     }
}
一維數(shù)組復(fù)制

從結(jié)果中可以看出初肉,設(shè)置destArray[0] = 9 酷鸦,destArray[1] = 9 后,srcArray after changed value的結(jié)果并沒有改變,僅僅只有destArray after changed value的結(jié)果改變臼隔。所以有如下結(jié)論:
**
在一維數(shù)組中嘹裂,元素都是基礎(chǔ)類型(如int,double等)躬翁,使用arraycopy()方法后焦蘑,是把原數(shù)組的值傳給了新數(shù)組,屬于值傳遞盒发。
**

接下來我們看看二維數(shù)組的復(fù)制代碼:

import java.util.Arrays;

public class MyClass {
     public static void main(String[] args) {
         char [][]one = new char[][]{{'a','b'},{'c','d'},{'e','f'}};
         System.out.println("srcArray:"+Arrays.toString(one[0]));

         char [][] another = new char [2][2] ;
         System.arraycopy(one, 0, another, 0, 2) ;
         System.out.println("destArray:"+Arrays.toString(another[0]));

         one[0][0] = 'x' ;      one[0][1] = 'y' ;
         System.out.println("srcArray after changed value:"+Arrays.toString(one[0]));
         System.out.println("destArray after changed value:"+Arrays.toString(another[0]));
     }
}
二維數(shù)組復(fù)制

從結(jié)果中可以看出例嘱,設(shè)置one[0][0] = 'x',one[0][1] = 'y' 后宁舰,srcArray after changed value的結(jié)果和destArray after changed value的結(jié)果相同拼卵。所以有如下結(jié)論:
**
二維數(shù)組使用arraycopy()方法后,第一維的引用被復(fù)制給新數(shù)組的第一維蛮艰,也就是兩個數(shù)組的第一維都指向相同的“那些數(shù)組”腋腮。而這時改變其中任何一個數(shù)組的元素的值,其實都修改了“那些數(shù)組”的元素的值壤蚜,所以原數(shù)組和新數(shù)組的元素值都一樣了即寡。
**

總結(jié):
1.一維數(shù)組的復(fù)制屬于值傳遞 ,修改副本原來的不會變
2.二維的數(shù)組袜刷,復(fù)制的結(jié)果是將源二維數(shù)組里一維數(shù)組的引用變量傳遞給副本聪富,修改任意一個數(shù)組的值,另一個數(shù)組的值也會相應(yīng)改變著蟹。也就是one[2][2]中墩蔓,one[i]是復(fù)制,one[i][j]是引用萧豆。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末奸披,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子涮雷,更是在濱河造成了極大的恐慌阵面,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件洪鸭,死亡現(xiàn)場離奇詭異膜钓,居然都是意外死亡,警方通過查閱死者的電腦和手機卿嘲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進店門颂斜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人拾枣,你說我怎么就攤上這事沃疮『腥茫” “怎么了?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵司蔬,是天一觀的道長邑茄。 經(jīng)常有香客問我,道長俊啼,這世上最難降的妖魔是什么肺缕? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮授帕,結(jié)果婚禮上同木,老公的妹妹穿的比我還像新娘。我一直安慰自己跛十,他們只是感情好彤路,可當我...
    茶點故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著芥映,像睡著了一般洲尊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上奈偏,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天坞嘀,我揣著相機與錄音,去河邊找鬼惊来。 笑死丽涩,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的唁盏。 我是一名探鬼主播内狸,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼检眯,長吁一口氣:“原來是場噩夢啊……” “哼厘擂!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起锰瘸,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤刽严,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后避凝,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體舞萄,經(jīng)...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年管削,在試婚紗的時候發(fā)現(xiàn)自己被綠了倒脓。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,773評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡含思,死狀恐怖崎弃,靈堂內(nèi)的尸體忽然破棺而出甘晤,到底是詐尸還是另有隱情,我是刑警寧澤饲做,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布线婚,位于F島的核電站,受9級特大地震影響盆均,放射性物質(zhì)發(fā)生泄漏塞弊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一泪姨、第九天 我趴在偏房一處隱蔽的房頂上張望游沿。 院中可真熱鬧,春花似錦驴娃、人聲如沸奏候。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蔗草。三九已至,卻和暖如春疆柔,著一層夾襖步出監(jiān)牢的瞬間咒精,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工旷档, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留模叙,地道東北人。 一個月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓鞋屈,卻偏偏與公主長得像范咨,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子厂庇,可洞房花燭夜當晚...
    茶點故事閱讀 44,689評論 2 354

推薦閱讀更多精彩內(nèi)容