假設(shè)我有以下數(shù)組聲明:new double[][] {new double[] {1, 2, 3}, new double[] {4,5,6}, new double[] {7,8,9}}我想將數(shù)組的內(nèi)容在給定方向上“翻譯”(移動(dòng))固定量,將現(xiàn)有內(nèi)容保留在未覆蓋的單元格中 - 例如:1 2 3 1 1 24 5 6 Shifted by +1 in x becomes: 4 4 57 8 9 7 7 81 2 3 1 2 34 5 6 Shifted by +1 in y becomes: 1 2 37 8 9 4 5 6我可以使用 System.arraycopy 相當(dāng)輕松地完成這些操作:按 dy 移位:boolean b2t = dy<0; // bottom to top movementdy = Math.abs(dy);if (b2t){ System.arraycopy(a, dy, a, 0, (a.length-dy));}else{ System.arraycopy(a, 0, a, dy, (a.length-dy)); }按 dx 平移:boolean l2r = dx>0; // left to right movementdx = Math.abs(dx);for (double[] i : a){ if (l2r) { System.arraycopy(i, 0, i, dx, (i.length-dx)); } else { System.arraycopy(i, dx, i, 0, (i.length-dx)); }} 當(dāng)我嘗試同時(shí)做這兩件事時(shí),有趣的行為就會(huì)出現(xiàn)(例如dx = 1 and dy = 1)。如果我按照所示順序使用上面的代碼(dy 然后 dx),則復(fù)制的數(shù)組似乎在 for 循環(huán)迭代中針對(duì)從中復(fù)制的數(shù)組進(jìn)行了更新。例如,對(duì)于 1..9 示例,對(duì)于 dx = 1 和 dy = 1,我觀察到的變化如下:Orig. dy for:dx(1) dx(2) dx(3)1 2 3 1 2 3 1 1 2 1 1 1 1 1 14 5 6 -> 1 2 3 -> 1 1 2 -> 1 1 1 -> 1 1 17 8 9 4 5 6 4 5 6 4 5 6 4 4 5正如您所看到的,在轉(zhuǎn)換for循環(huán)期間dx,它將第一行和第二行視為同一個(gè)對(duì)象;因此應(yīng)用轉(zhuǎn)換兩次 - 兩次將其應(yīng)用到兩個(gè)數(shù)組。System.arraycopy 的文檔指出:如果 src 和 dest 參數(shù)引用相同的數(shù)組對(duì)象,則執(zhí)行復(fù)制操作,就好像位置 srcPos 到 srcPos+length-1 處的組件首先被復(fù)制到具有 length 組件的臨時(shí)數(shù)組中,然后臨時(shí)數(shù)組的內(nèi)容被復(fù)制到復(fù)制到目標(biāo)數(shù)組的 destPos 到 destPos+length-1 位置。換句話說,當(dāng)dy轉(zhuǎn)換完成時(shí),頂部?jī)尚斜粡?fù)制到一個(gè)單獨(dú)的臨時(shí)數(shù)組,然后返回到主數(shù)組,a但處于移位的位置。在我看來,它是將 復(fù)制reference到數(shù)組,而不是數(shù)組本身 - 這是發(fā)生了什么嗎?無論如何,我可以通過交換代碼來解決這個(gè)問題,這樣它就可以在 dy 之前進(jìn)行 dx 轉(zhuǎn)換;但確認(rèn)這里發(fā)生的事情會(huì)很有趣;因?yàn)槿绻蚁雽⑵鋽U(kuò)展為 3 個(gè)維度,我將無法僅僅通過重新排列它來使其發(fā)揮作用。
1 回答

幕布斯6054654
TA貢獻(xiàn)1876條經(jīng)驗(yàn) 獲得超7個(gè)贊
是的,就是復(fù)制參考文獻(xiàn)。
二維數(shù)組實(shí)際上是一個(gè)數(shù)組,其元素是數(shù)組類型的對(duì)象。
因此,當(dāng)System.arraycopy
將源數(shù)組的元素復(fù)制到目標(biāo)數(shù)組時(shí)(無論它們是否是同一數(shù)組),它都會(huì)復(fù)制對(duì)這些元素的引用,在您的情況下這意味著對(duì)內(nèi)部數(shù)組的引用。
添加回答
舉報(bào)
0/150
提交
取消