Java數(shù)組復(fù)制——Arrays.copyOf()地址傳遞問題

歡迎糾錯运杭,轉(zhuǎn)載注明出處院塞,have a nice day!

今天在做項目的時候有個需求要用到二維數(shù)組復(fù)制,我不假思索地以為和一維數(shù)組一樣戏溺,結(jié)果出錯了渣蜗,特此記錄一下。

Arrays.copyOf()方法返回的拷貝數(shù)組的地址是否指向原數(shù)組旷祸?

答案很明顯是否的耕拷,因為在源碼中很明顯是new了個新數(shù)組返回。

public static int[] copyOf(int[] original, int newLength) {
        //new一個新數(shù)組托享,然后調(diào)用System.arraycopy復(fù)制
        int[] copy = new int[newLength];
        System.arraycopy(original, 0, copy, 0,
                         Math.min(original.length, newLength));
        return copy;
    }

雖然返回的數(shù)組地址與原數(shù)組不同骚烧,但是數(shù)組中的數(shù)據(jù)就未必了,上代碼:
新建兩個數(shù)組闰围,分別存放基本數(shù)據(jù)和對象赃绊,然后對他們進(jìn)行拷貝,再對拷貝的數(shù)組的第一個元素進(jìn)行修改羡榴”滩椋可以看出,啊a1數(shù)組的元素并未發(fā)生改變校仑,而a2數(shù)組的元素改變了忠售。

public class TestArraysCopy {
    public static void main(String[] args) {
        int[] a1 = new int[] {1, 2, 3, 4};
        Num[] a2 = new Num[] {new Num(1), new Num(2), new Num(3), new Num(4)};
        
        int[] c1 = Arrays.copyOf(a1, a1.length);
        Num[] c2 = Arrays.copyOf(a2, a2.length);
        
        c1[0] = 0;
        c2[0].num = 0;
        
        System.out.println("a1: " + a1[0] + " c1: " + c1[0]);//a1: 1 c1: 0
        System.out.println("a2: " + a2[0].num + " c2: " + c2[0].num);//a2: 0 c2: 0
    }
}

class Num{
    int num;
    
    public Num(int num) {
        this.num = num;
    }
}

可以看出,對于對象數(shù)組的copy迄沫,數(shù)組中的元素引用的是原數(shù)組中對象的地址稻扬。我們debug來看一下數(shù)組地址


內(nèi)存地址

發(fā)現(xiàn),a1,a2與c1,c2的數(shù)組地址不同,但a2與c2的元素的地址是相同的邢滑,所以證實上面的說法腐螟。

那么二維數(shù)組的拷貝有什么不同嗎?

我之前對二維數(shù)組的拷貝操作是這樣的

        int[][] a3 = new int[][] {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
        int[][] c3 = Arrays.copyOf(a3, a3.length);
        
        c3[0][0] = 0;
        
        System.out.println("a3: " + a3[0][0] + " c3: " + c3[0][0]);//a3: 0 c3: 0

我們都知道困后,數(shù)組在java中是看做對象來處理的乐纸,如果按照我之前的操作,則會把a(bǔ)3中的每個子數(shù)組的地址傳遞到c3中摇予。所以對二維數(shù)組的拷貝要這么做:

int[][] a3 = new int[][] {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
        int[][] c3 = new int[a3.length][];
        for (int i = 0; i < a3.length; i++) {
            c3[i] = Arrays.copyOf(a3[i], a3[i].length);
        }
        c3[0][0] = 0;
        
        System.out.println("a3: " + a3[0][0] + " c3: " + c3[0][0]);//a3: 1 c3: 0

先為c3開辟3個新地址汽绢,然后就和一維數(shù)組拷貝一樣了。

注意:當(dāng)二維數(shù)組是對象數(shù)組的時候侧戴,想要拷貝就只能老老實實用for循環(huán)宁昭,new一個新對象,將舊對象的數(shù)據(jù)傳遞給新對象酗宋。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末积仗,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蜕猫,更是在濱河造成了極大的恐慌寂曹,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件回右,死亡現(xiàn)場離奇詭異隆圆,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)翔烁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門渺氧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蹬屹,你說我怎么就攤上這事侣背。” “怎么了哩治?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵秃踩,是天一觀的道長。 經(jīng)常有香客問我业筏,道長憔杨,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任蒜胖,我火速辦了婚禮消别,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘台谢。我一直安慰自己寻狂,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布朋沮。 她就那樣靜靜地躺著蛇券,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上纠亚,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天塘慕,我揣著相機(jī)與錄音,去河邊找鬼蒂胞。 笑死图呢,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的骗随。 我是一名探鬼主播蛤织,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼鸿染!你這毒婦竟也來了指蚜?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤涨椒,失蹤者是張志新(化名)和其女友劉穎姚炕,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體丢烘,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡柱宦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了播瞳。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片掸刊。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖赢乓,靈堂內(nèi)的尸體忽然破棺而出忧侧,到底是詐尸還是另有隱情,我是刑警寧澤牌芋,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布蚓炬,位于F島的核電站,受9級特大地震影響躺屁,放射性物質(zhì)發(fā)生泄漏肯夏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一犀暑、第九天 我趴在偏房一處隱蔽的房頂上張望驯击。 院中可真熱鬧,春花似錦耐亏、人聲如沸徊都。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽暇矫。三九已至主之,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間李根,已是汗流浹背杀餐。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留朱巨,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓枉长,卻偏偏與公主長得像冀续,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子必峰,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344

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

  • 論思想的重要性~一只部隊要打勝仗:一個團(tuán)隊一個企業(yè)要想立足于不敗之地洪唐,人的思想不統(tǒng)一永遠(yuǎn)形成不了合力~而決定人的思...
    建峰兄閱讀 2,512評論 0 0
  • 昨天上完樂高課去學(xué)校接她,老師說中午又不睡覺了吼蚁,然后告訴我她中午的時候自己把衣服脫了凭需,跑到娃娃家玩,老師給她抱回家...
    大臉貓黑黑閱讀 60評論 0 0
  • 歲月對于我來講肝匆,是在時間年輪里的一個別稱粒蜈。她可以極速飛逝,也可停滯不前旗国。十年前的我枯怖,是追風(fēng)少年,而今三十四能曾,依舊是...
    風(fēng)溢樣的男子閱讀 316評論 0 0
  • 1 幾個月前,表姐辭職了驼唱。 表姐在我們當(dāng)?shù)匾凰鈬Z學(xué)校教英語藻茂,工作不輕松,但待遇很優(yōu)厚玫恳。 但還是遞交了辭職信捌治,因...
    安心在奔跑閱讀 630評論 0 1