java深拷贝和浅拷贝介绍
生活随笔
收集整理的這篇文章主要介紹了
java深拷贝和浅拷贝介绍
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
淺拷貝概念
?
?
深拷貝概念
@Data @Slf4j public class Sheep implements Cloneable {private String name;private int age;private String color;private Sheep friend;public Sheep(String name, int age, String color) {this.name = name;this.age = age;this.color = color;}@Overrideprotected Object clone(){Sheep sheep = null;try {sheep = (Sheep) super.clone();} catch (Exception e) {log.info("" + e);}return sheep;} } @Data public class DeepPrptoType implements Serializable, Cloneable {private static final long serialVersionUID = 1L;private String name;private DeepCloneableTarget deepCloneableTarget;public DeepPrptoType() {}//深拷貝方式1 使用clone方法@Overrideprotected Object clone() throws CloneNotSupportedException {Object deep = null;//這里對基本數(shù)據(jù)類型和String對克隆deep = super.clone();DeepPrptoType deepPrptoType = (DeepPrptoType) deep;deepPrptoType.deepCloneableTarget = (DeepCloneableTarget) deepCloneableTarget.clone();return deepPrptoType;}//深拷貝,方式2 通過對象的序列化實(shí)現(xiàn)(推薦使用)public static <T extends Serializable> T deepClone(T obj) {T cloneObj = null;try {//寫入字節(jié)流ByteArrayOutputStream out = new ByteArrayOutputStream();ObjectOutputStream obs = new ObjectOutputStream(out);obs.writeObject(obj);obs.close();//分配內(nèi)存,寫入原始對象,生成新對象ByteArrayInputStream ios = new ByteArrayInputStream(out.toByteArray());ObjectInputStream ois = new ObjectInputStream(ios);//返回生成的新對象cloneObj = (T) ois.readObject();ois.close();} catch (Exception e) {e.printStackTrace();}return cloneObj;} } public class Client2 {public static void main(String[] args) throws CloneNotSupportedException {DeepPrptoType p = new DeepPrptoType();p.setName("深拷貝");p.setDeepCloneableTarget(new DeepCloneableTarget("大牛", "哈哈"));//方式一:深拷貝DeepPrptoType p2 = (DeepPrptoType) p.clone();System.out.println(p.getName() + p.getDeepCloneableTarget().hashCode());System.out.println(p2.getName() + p2.getDeepCloneableTarget().hashCode());//通過序列化和反序列化實(shí)現(xiàn)深拷貝,說明引用類型所指向的對象也被clone了DeepPrptoType p3 = DeepPrptoType.deepClone(p);System.out.println(p3.getName() + p3.getDeepCloneableTarget().hashCode());} }總結(jié)
以上是生活随笔為你收集整理的java深拷贝和浅拷贝介绍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Javascript与C#中使用正则表达
- 下一篇: java如何对List集合中的元素进行排