您当前的位置: 首页 >  Java

星拱北辰

暂无认证

  • 0浏览

    0关注

    1205博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

【Java】总结Java数组的拷贝和输出

星拱北辰 发布时间:2020-03-04 00:46:21 ,浏览量:0

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(),下为一例测试结果:

[I@27973e9b

这个地址啊,每个人测都不一样啦,更何况本身就是虚拟中的虚拟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             
关注
打赏
1660750074
查看更多评论
1.4198s