[java项目实战] java 浅拷贝和深拷贝
在项目开发工程中我们最常见的就是使用浅拷贝进行复制,因为浅拷贝进行复制,我们只需要把旧对象的引用复制给新对象就可以了,时间复杂度和空间复杂度都非常的低,但是我们要是进行深拷贝所需要的资源就会很多了,并且在实际项目中很少能用到深拷贝,所以我们常见的方法基本都是浅拷贝,如果我们需要深拷贝,那么我在这里也介绍几种深拷贝的方法
浅拷贝
- 数据类型是基本数据类型成员变量,浅拷贝进行值传递。因为两份不同的数据,所以对其中一个对象的该成员变量值进行修改,不会影响另一个对象拷贝得到的数据
- 数据类型是引用数据类型的成员变量,浅拷贝会进行引用传递,也就是只是将该成员变量的引用值(内存地址)复制一份给新的对象。因为实际上两个对象的该成员变量都指向同一个实例。一个对象中修改该成员变量会影响到另一个对象的该成员变量值
常见浅拷贝形式
-
遍历循环复制
-
List<Person> destList = new ArrayList<Person>(srcList.size); for(Person p : srcList){ destList.add(p); }
-
-
使用List实现类的构造方法
-
List<Person> destList = new ArrayList<Person>(srcList);
-
-
使用List.addALL()方法
-
List<Person> destList = new ArrayList<Person>(); destList.addAll(srcList);
-
-
重写clone()方法进行浅拷贝
-
使用System.arraycopy()方法
深拷贝
- 不仅要复制对象的所有基本数据类型的成员变量值,还要为所有引用数据类型的成员变量申请存储空间,并复制每个引用数据类型成员变量所引用的对象,直到该对象可达的所有对象。也就是说,对象进行深拷贝要对整个对象图进行拷贝!
常见深拷贝形式
-
重写clone方法来实现深拷贝
-
对象序列化实现深拷贝
-
this.para = (Map<String, Object>) SerializationUtils.clone((HashMap<String, Object>)po.getPara());
-
手动赋值,效率高,但代码过于啰嗦
-
用fastjson从Object转成json,然后转回object,本质上是反射
-
String json = JSON.toJSONString(obj); return JSON.parseObject(json, Object.class);