【Java】总结Java数组的拷贝和输出
Java的clone()方法
想clone(),先需要實現Cloneable接口,如此才能拷貝。
眾所周知,Java中的clone()多為淺拷貝,即只復制引用,不會另外開辟完整空間重新存儲的,一旦原先對象改變,拷貝后的對象也改變了。
想要實現深拷貝,固然有很多方法,不過確實有點小麻煩,這里暫不說明。
Java數組的clone()方法
Java數組的clone()方法到底是深拷貝還是淺拷貝?
這個問題要分情況討論。
下面分別說說一維數組的clone()和二維/多維數組的clone():
- 一維數組的clone()是深拷貝
- 二維數組乃至多維數組的clone()是淺拷貝
為什么這么說?
實際上,Java數組的clone()支持了深拷貝,這是對于一維數組而言的。
但我們知道,Java的二維數組并不是嚴格意義上的二維數組,而是一維(一維數組)數組,第一維數組的對象分別是各自的一維數組引用,從而構成了所謂的二維數組。
故而,在拷貝二維數組的時候,深拷貝了整個第一維數組,重新開辟了每一個第一維數組的空間,但每個第一維數組的對象還是一個一維數組的對象,這是個引用,所以實際上沒復制過來orz。
怎么實現二維數組的深拷貝
Good Question!
當然是開一層for循環,把每一個第一維數組中的數組對象都進行一下拷貝,就結束了。
怎么優雅地打印數組
錯誤的數組打印
比如在文末提供的完整代碼中,我們如果這么打印數組:
System.out.println(array2);這看起來是對的,但我們是不是想到了數組是個引用類型啊?
引用類型的toString(),嘿嘿,數組正好打印type@address格式的toString(),下為一例測試結果:
這個地址啊,每個人測都不一樣啦,更何況本身就是虛擬中的虛擬orz。
一維數組的打印
想要打出來,還不想暴力開循環,就使用Arrays.toString(array2)好了。
二維/多維數組又不行了,怎么辦?
當然不能使用Arrays.toString(array2)了,但Arrays類提供了Arrays.deepToString(array2),這樣就OK啦。
打印結果的格式見文末。
完整測試代碼
import java.util.Arrays;public class ArrayCloneTest {public static void main(String[] args) {int[] array1 = new int[] {1, 2, 3, 4};int[] array2 = array1.clone();System.out.println(Arrays.toString(array2));array1[3] = 5;System.out.println(Arrays.toString(array2));int[][] array3 = new int[][] {{1, 2, 3, 4}, {2, 3, 4, 5}, {3, 4, 5, 6}};int[][] array4 = array3.clone();array4[2][0] = 4;array4[2][1] = 5;array4[2][2] = 6;array4[2][3] = 7;System.out.println(Arrays.deepToString(array4));array4[2][0] = 3;array4[2][1] = 4;array4[2][2] = 5;array4[2][3] = 6;for (int i = 0; i < array3.length; i++) {array4[i] = array3[i].clone();}System.out.println(Arrays.deepToString(array4));} }測試結果
[1, 2, 3, 4] [1, 2, 3, 4] [[1, 2, 3, 4], [2, 3, 4, 5], [4, 5, 6, 7]] [[1, 2, 3, 4], [2, 3, 4, 5], [3, 4, 5, 6]]測試結果驗證了我們的想法!
總結
以上是生活随笔為你收集整理的【Java】总结Java数组的拷贝和输出的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Git】Git兼容GitHub和Git
- 下一篇: 【Java】Java对象序列化I/O体系