【Java克隆专题】

[1] 深克隆和浅克隆的区别?

浅拷贝浅克隆只是复制了对象的引用地址。是将原始对象中的数据型字段拷贝到新对象中去,将引用型字段的“引用”复制到新对象中去,不把“引用的对象”复制进去,所以原始对象和新对象引用同一对象,新对象中的引用型字段发生变化会导致原始对象中的对应字段也发生变化。

深拷贝深拷贝是将对象及值复制过来,两个对象修改其中任意的值另一个值不会改变。是在引用方面不同,深拷贝就是创建一个新的和原始字段的内容相同的字段,是两个一样大的数据段,所以两者的引用是不同的,之后的新对象中的引用型字段发生改变,不会引起原始对象中的字段发生改变。

[2] 如何实现对象的克隆?

(1)实现 Cloneable 接口并重写 Object 类中的 clone() 方法;

(2)实现 Serializable 接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深克隆。

[3] 数组的四种拷贝方式对比

https://blog.csdn.net/weixin_42220532/article/details/84200634

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3Rc0JAwg-1596592151107)(X:\Users\xu\AppData\Roaming\Typora\typora-user-images\image-20200628205703300.png)]

对于基本数据类型来说可以理解为是深拷贝,对于引用类型来说是浅拷贝,它们拷贝的是引用,和被拷贝的引用指向同一个对象。

link1link2

[4] 数组的四种拷贝方式实现
package 其他;

import java.util.Arrays;

public class 数组的四种拷贝方式 {
    public static void main(String[] args) {
        for_copy();
        clone_copy();
        arraycopy_copy();
        ArrayscopyOf_copy();
    }

    /**
     * for循环拷贝数组
     */
    public static void for_copy() {
        //一维数组的拷贝
        int[] array1={1,2,3,4,5,6,7};
        int[] array2=new int[array1.length];

        for(int i = 0;i < array1.length;i++){
            array2[i] = array1[i];
        }
        System.out.println(Arrays.toString(array2));

        //二维数组的拷贝
        int[][] array3= {{1,2,3},{4,5,6}};
        int[][] array4 = new int[2][3];

        for(int i = 0;i < array3.length;i++){
            for(int j = 0;j < array3[i].length;j++){
                array4[i][j] = array3[i][j];
            }
        }
        System.out.println(Arrays.deepToString(array4));
    }

    /**
     * clone拷贝数组
     */
    public static void clone_copy() {
        //一维数组的拷贝
        int[] array1={1,2,3,5,9,8,7};
        int[] array2=new int[array1.length];
        array2=array1.clone();
        System.out.println(Arrays.toString(array2));


        //二维数组的拷贝
        int[][] array3={{1,2,3,4},{5,6,7}};
        int[][] array4=new int[2][];

        for(int i = 0;i < array3.length;i++){
            array4[i] = array3[i].clone();
        }
        for(int i=0;i<array3.length;i++){
            System.out.print(Arrays.toString(array4[i]));
        }

    }

    /**
     * System.arraycopy拷贝数组
     */
    public static void arraycopy_copy() {
        //一维数组的拷贝
        int[] array = {1,2,3,4,5};
        int[] array2 = new int[array.length];
        System.arraycopy(array, 0, array2, 0, array.length);//(被复制的数组,从几号下标开始复制,复制到哪个数组,复制到新数组第几号下标,复制长度)
        System.out.println(Arrays.toString(array2));

        //二维数组的拷贝
        int[][] array1={{1,2,3,5,9},{2,3,36,5,7}};
        int[][] array3=new int[2][5];
        for(int i=0;i<array1.length;i++){
            System.arraycopy(array1[i], 0, array3[i], 0, array1[i].length);
        }
        System.out.println(Arrays.deepToString(array3));
    }

    /**
     * Arrays.copyOf拷贝数组
     */
    public static void ArrayscopyOf_copy() {
        //一维数组的拷贝
        int[] array=new int[4];
        System.out.println(Arrays.toString(array));
        int[] array1 = new int[4];
        array1 = Arrays.copyOf(array,array.length);//将数组array拷贝到数组brr,拷贝长度为array.length
        System.out.println(Arrays.toString(array1));

        //一维数组的拷贝
        int[][] array2={{1,2,3,4},{2,6,7,5}};
        int[][] array3=new int[2][4];
        array3=Arrays.copyOf(array2, array2.length);
        System.out.println(Arrays.deepToString(array3));
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值