亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

System.ArrayCopy 如何復制數組的數組?

System.ArrayCopy 如何復制數組的數組?

元芳怎么了 2023-08-04 17:36:38
假設我有以下數組聲明:new double[][] {new double[] {1, 2, 3}, new double[] {4,5,6}, new double[] {7,8,9}}我想將數組的內容在給定方向上“翻譯”(移動)固定量,將現有內容保留在未覆蓋的單元格中 - 例如: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 相當輕松地完成這些操作:按 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));       }}   當我嘗試同時做這兩件事時,有趣的行為就會出現(例如dx = 1 and dy = 1)。如果我按照所示順序使用上面的代碼(dy 然后 dx),則復制的數組似乎在 for 循環迭代中針對從中復制的數組進行了更新。例如,對于 1..9 示例,對于 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正如您所看到的,在轉換for循環期間dx,它將第一行和第二行視為同一個對象;因此應用轉換兩次 - 兩次將其應用到兩個數組。System.arraycopy 的文檔指出:如果 src 和 dest 參數引用相同的數組對象,則執行復制操作,就好像位置 srcPos 到 srcPos+length-1 處的組件首先被復制到具有 length 組件的臨時數組中,然后臨時數組的內容被復制到復制到目標數組的 destPos 到 destPos+length-1 位置。換句話說,當dy轉換完成時,頂部兩行被復制到一個單獨的臨時數組,然后返回到主數組,a但處于移位的位置。在我看來,它是將 復制reference到數組,而不是數組本身 - 這是發生了什么嗎?無論如何,我可以通過交換代碼來解決這個問題,這樣它就可以在 dy 之前進行 dx 轉換;但確認這里發生的事情會很有趣;因為如果我想將其擴展為 3 個維度,我將無法僅僅通過重新排列它來使其發揮作用。
查看完整描述

1 回答

?
幕布斯6054654

TA貢獻1876條經驗 獲得超7個贊

是的,就是復制參考文獻。

二維數組實際上是一個數組,其元素是數組類型的對象。

因此,當System.arraycopy將源數組的元素復制到目標數組時(無論它們是否是同一數組),它都會復制對這些元素的引用,在您的情況下這意味著對內部數組的引用。


查看完整回答
反對 回復 2023-08-04
  • 1 回答
  • 0 關注
  • 116 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號