我有一個二維數組number2。我將它設置爲number2copy與number2copy = number2 然後,我調用一個方法Zeroed將它傳遞給2維數組ToBeZeroed。這個方法用0填充數組,我知道它的工作原理。它返回完全爲零的ToBeZeroed。但是,當我把number2 = ToBeZeroed; number2copy也填充了零。我該如何分解這些東西,使其中一個變化不會導致另一個變化?他們是無關的陣列,所以他們需要分開處理Java數組總是等於
回答
Java不是C++。您將引用複製到歸屬於第一維的數組,而不是數組對象和數組子對象。您需要使用number2copy = (int[][])deepCopy(number2);
,它將執行適合您需求的深度數組副本,包括其中包含的第二維數組副本。用int[][]
替代你沒有告訴我們的二維數組數據類型:)另外,要檢查一個對象是否與另一個對象相等,==
將檢查對二維數組的第一維數組的引用,這可能不是什麼你要。爲了深入檢查,請使用Arrays.deepEquals(number2, number2copy);
,這應該可以正常工作。
深層複製源代碼:
public static Object deepCopy(Object src)
{
int srcLength = Array.getLength(src);
Class srcComponentType = src.getClass().getComponentType();
Object dest = Array.newInstance(srcComponentType, srcLength);
if (srcComponentType.isArray())
{
for (int i = 0; i < Array.getLength(src); i++)
Array.set(dest, i, deepCopy(Array.get(src, i)));
}
else
{
System.arraycopy(src, 0, dest, 0, srcLength);
}
return dest;
}
一個簡短的說明見here。
編輯:我剛剛注意到,他說二維數組,所以修正的應答者適當:)
數組在Java中是Object
S和因此有引用語義。也就是說,分配操作x = y;
別名以及x
和y
現在都指代相同的實際對象。
(的即相對的是值語義,由此y
值獲取複製到不同值x
;原始類型如int
具有值語義。)
您需要作出顯式new
數組並複製數據。
值與引用語義的區別是Java類型系統的一個最重要的方面。
我設置它等於與number2copy到number2copy = NUMBER2
此時,並且從那時起(除非你一個不同的值分配給任一那些參考文獻的)number2copy
和number2
指向的相同的陣列。當您通過一個引用更改數組時,更改通過另一個引用可見。
我該如何分解這些東西,使其中一個變化不會導致另一個變化?他們是無關的陣列,所以他們需要好單獨
處理,如果他們是無關的陣列,那麼你不應該做的number2copy = number2
...因爲這使得他們在同一陣列。
如果你想零2-d數組,你需要做的是這樣的:
for (int i = 0; i < toBeZeroed.length; i++) {
for (int j = 0; j < toBeZeroed[i].length; j++) {
toBeZeroed[i][j] = 0;
}
}
如果你想有2 d陣列複製到另一個,則需要做這樣的事情:
for (int i = 0; i < from.length; i++) {
for (int j = 0; j < from[i].length; j++) {
to[i][j] = from[i][j];
}
}
(這裏假定from
和to
陣列具有相同的尺寸,有沒有空的子陣列,等等)
您可能能夠找到第三方庫,以您需要的方式將零排列或複製數組。然而,在你學習的時候,你會親自實現這些,以幫助你獲得關於Java工作的清晰的心智模型;例如參考分配,什麼是2-d陣列真的是,等...
小心使用clone
複製一個2-d(或以上)數組:
它創建一個新的數組對象,您似乎希望將現有數組中的值複製到另一個現有數組中。
它只執行淺拷貝;即新陣列將共享原始陣列的子陣列,並且最終會導致當前正試圖避免更改一個陣列影響另一個陣列的情況。
- 1. 總和等於X的數組值總和等於X
- 2. 將等於一個整數總是等於一個整數嗎?
- 3. UISegmentedControl總是等於0
- 4. 變量總是等於零
- 5. Ajax readyState總是等於1
- 6. Python - 總結大於或等於某個值的數字組合
- 7. 組合誰總和等於n
- 8. 查找不同數字組合的數量,使其總數等於總和
- 9. 如何從n個數組的數組中找到一個數組(數組)的數組(數組),其總和恰好等於(或幾乎等於)數x。
- 10. JavaFx模型等於總是返回false
- 11. 查找百分比總是等於0?
- 12. 在jQuery中event.currentTarget總是等於$(this)嗎?
- 13. 統計ST_MODE總是等於16877
- 14. $ _SESSION ['session_id']總是等於$ _COOKIE ['PHPSESSID']?
- 15. 使用PayPal簽出總是等於零
- 16. 將n個數字分成兩組,每組的總和小於等於k
- 17. Java等於關於數組中的null的方法
- 18. 基於java的算法,如果有,其總和等於x
- 19. sql加入等於數組
- 20. 無論num1,num2或num3輸入的總分總是等於0.0
- 21. .NET等價於Java線程組?
- 22. 爲什麼純虛析構函數總是等同於零
- 23. VBA Excel:插入SUM函數,但它總是等於零
- 24. Android FaceDetector總是返回檢測到的人臉數等於0
- 25. Java:一維數組是否總是在內存中連續?
- 26. 查找最大總數連續子數組,使得子數組的長度小於等於k?
- 27. Java泛型總是用於收集
- 28. 計數總和大於或等於k的子集的數量
- 29. $ _POST數組總是空
- 30. 什麼是Visual Basic等同於Java的「!」?
如何發佈實際的代碼? – 2012-01-15 00:52:18
爲什麼地球上你會寫代碼的英文描述,而不是隻發佈代碼本身? – 2012-01-15 00:52:51