网站优化

网站优化

Products

当前位置:首页 > 网站优化 >

学习Java对象拷贝,掌握高效复制技巧,提升代码性能?

GG网络技术分享 2025-11-16 17:15 1


啥是Java对象拷贝?

啊,Java对象拷贝,就是复制一个Java对象,让它变成另一个新鲜的对象。就像我们细小朋友分糖果一样,一份变成两份,但是两个糖果盒里的糖果是一样的。

拷贝时需要考虑的问题

拷贝的时候, 我们要考虑拷贝后的对象是不是还Neng正常干活,就像糖果是不是还甜一样。

还有拷贝的类型,这玩意儿hen关键,就像糖果是结实糖还是柔软糖。

深厚拷贝:这玩意儿就像把糖果放在一个新鲜的盒子里 盒子里面的糖果是和原来的糖果一模一样的,但是它们是彻头彻尾分开的。

manualClone1:manualClone2:

从输出后来啊Nengkan出, 手动拷贝就像我们自己动手分糖果一样,比比kan麻烦,而且轻巧松出现错误。

Ru果拷贝的对象存在循环引用, 拷贝时会产生死循环,这玩意儿就像我们分糖果的时候不细小心把一个糖果分成了hen许多细小块,然后又把这些个细小块拼在一起,这样就乱了套了。

autoClone1:autoClone2:

从输出后来啊Nengkan出, 自动拷贝就像有个机器帮我们分糖果,Neng少许些手动编写代码的干活量。

浅薄拷贝:糖果的表面和盒子

浅薄拷贝:这玩意儿就像只拷贝了糖果的表面和盒子,盒子里面还是原来的糖果。

浅薄拷贝只拷贝对象的基本数据类型, 比如int、float,还有对象类型,只是拷贝对象的引用地址。

拷贝的方式:自己分糖果还是机器分糖果?

拷贝的方式有两种,一种是手动拷贝,另一种是自动拷贝。

拷贝后的对象是不是还Neng正常干活,这玩意儿就像拷贝的糖果是不是还Neng吃一样。

代码示例:糖果分装的两种方法

public class ShallowCopy implements Cloneable {
    private String name;
    private DeepCopy deepCopy;
    //省略get和set方法
    @Override
    public ShallowCopy clone throws CloneNotSupportedException {
        return  super.clone;
    }
}
public class DeepCopy implements Cloneable {
    private String value;
    //省略get和set方法
    @Override
    public DeepCopy clone throws CloneNotSupportedException {
        return  super.clone;
    }
}
public static void main throws CloneNotSupportedException {
    ShallowCopy shallowCopy1 = new ShallowCopy;
    shallowCopy1.setName;
    DeepCopy deepCopy1 = new DeepCopy;
    deepCopy1.setValue;
    shallowCopy1.setDeepCopy;
    ShallowCopy shallowCopy2 = shallowCopy1.clone;
    System.out.println);
    System.out.println);
}

输出后来啊如下:

shallowCopy1:shallowCopy2:

糖果分装的文艺

Java对象拷贝就像糖果分装的文艺, 我们需要掌握优良技巧,才Neng让拷贝的对象既甜又漂亮。

拷贝的时候要注意拷贝的类型, 拷贝的方式,还有拷贝后对象是不是Neng正常干活,这些个dou是hen关键的。

Ru果拷贝的对象的成员变量中包含线程、 锁等非线程平安对象,我们需要考虑怎么处理,就像糖果分装的时候要注意不要把糖果弄碎了。

public class AutoClone implements Cloneable {
    private String name;
    private DeepCopy deepCopy;
    //省略get和set方法
    @Override
    public AutoClone clone throws CloneNotSupportedException {
        AutoClone autoClone =  super.clone; //浅薄拷贝
        Field fields = this.getClass.getDeclaredFields; //获取全部的成员变量
        try {
            for  {
                field.setAccessible; //取消访问权限检查
                Object fieldObj = field.get; //获取成员变量的值
                if  { //判断是不是需要拷贝
                    field.set fieldObj).clone); //递归拷贝
                } else {
                    field.set;
                }
            }
        } catch  {
            e.printStackTrace;
        }
        return autoClone;
    }
}
public static void main throws CloneNotSupportedException {
    AutoClone autoClone1 = new AutoClone;
    autoClone1.setName;
    DeepCopy deepCopy1 = new DeepCopy;
    deepCopy1.setValue;
    autoClone1.setDeepCopy;
    AutoClone autoClone2 = autoClone1.clone;
    System.out.println);
    System.out.println);
    System.out.println.hashCode + " " + autoClone2.getDeepCopy.hashCode);
}

autoClone1:deepCopy1:

深厚拷贝:完整的糖果复制

从输出后来啊Nengkan出, 深厚拷贝就像完整的糖果复制,两个对象是独立的,修改一个对象的成员变量值不会关系到到另一个对象的值。

Ru果拷贝的对象存在深厚度递归引用,觉得Neng用深厚拷贝,否则拷贝后来啊兴许不符合预期。

public class DeepCopy implements Cloneable {
    private String value;
    //省略get和set方法
    @Override
    public DeepCopy clone throws CloneNotSupportedException {
        DeepCopy deepCopy =  super.clone; //浅薄拷贝
        deepCopy.setValue); //拷贝String类型
        return deepCopy;
    }
}
public static void main throws CloneNotSupportedException {
    DeepCopy deepCopy1 = new DeepCopy;
    deepCopy1.setValue;
    DeepCopy deepCopy2 = deepCopy1.clone;
    System.out.println);
    System.out.println);
}

deepCopy1:deepCopy2:

手动拷贝:手工分糖果

public class ManualClone implements Cloneable {
    private String name;
    private DeepCopy deepCopy;
    //省略get和set方法
    @Override
    public ManualClone clone throws CloneNotSupportedException {
        ManualClone manualClone =  super.clone; //浅薄拷贝
        DeepCopy deepCopyClone = deepCopy.clone; //递归拷贝DeepCopy对象
        manualClone.setDeepCopy; //手动设置对象引用
        return manualClone;
    }
}
public static void main throws CloneNotSupportedException {
    ManualClone manualClone1 = new ManualClone;
    manualClone1.setName;
    DeepCopy deepCopy1 = new DeepCopy;
    deepCopy1.setValue;
    manualClone1.setDeepCopy;
    ManualClone manualClone2 = manualClone1.clone;
    System.out.println);
    System.out.println);
    System.out.println.hashCode + " " + manualClone2.getDeepCopy.hashCode);
}

manualClone1:manualClone2:

优良了 今天我们就聊到这里希望巨大家dou学会了怎么分装糖果,也就是怎么进行Java对象拷贝。下次我们再聊其他的编程技巧。

标签:

提交需求或反馈

Demand feedback