先上代码
HelloWorld.java
import java.util.ArrayList; import java.util.List; /** * 深浅拷贝集合思路 * @author Scen * @date 2018/10/8 17:42 */ public class HelloWorld { public static void main(String[] args) { lowCopy(); deepCopy(); } private static void lowCopy(){ System.out.println("=====浅拷贝list开始====="); // 两个不同的对象 UserDemo userDemo1 = new UserDemo("红", 1); UserDemo userDemo2 = new UserDemo("蓝", 2); // 原始list(有泛型) List<UserDemo> userDemoListOld = new ArrayList<>(); userDemoListOld.add(userDemo1); userDemoListOld.add(userDemo2); // 打印原始list System.out.println("======原始list集合====="); System.out.println(userDemoListOld); // 浅拷贝原始list集合并处理 List<UserDemo> lowUserDemoList=new ArrayList<>(); lowUserDemoList = userDemoListOld; lowUserDemoList.removeIf(next -> "蓝".equals(next.getName())); // 打印浅list和原始list System.out.println("=====浅list集合和原始list集合"); System.out.println("浅:"+lowUserDemoList); // 浅拷贝出来的list集合里的元素为引用类型,并且内存地址值和原来的保持一致,删除一个元素导致原始list集合元素随之减少 System.out.println("原始:"+userDemoListOld); System.out.println("=====浅拷贝list结束====="); System.out.println("****************"); } private static void deepCopy() { System.out.println("=====深拷贝list开始====="); // 两个不同的对象 UserDemo userDemo1 = new UserDemo("红", 1); UserDemo userDemo2 = new UserDemo("蓝", 2); // 原始list(有泛型) List<UserDemo> userDemoListOld = new ArrayList<>(); userDemoListOld.add(userDemo1); userDemoListOld.add(userDemo2); // 打印原始list System.out.println("======原始list集合====="); System.out.println(userDemoListOld); // 深拷贝原始list集合并处理 List<UserDemo> deepUserDemoList = JsonUtils.jsonToList(JsonUtils.objectToJson(userDemoListOld), UserDemo.class); deepUserDemoList.removeIf(next -> "蓝".equals(next.getName())); // 打印深list和原始list System.out.println("=====深list集合和原始list集合"); System.out.println("深:"+deepUserDemoList); // 浅拷贝出来的list集合里的元素为引用类型,并且内存地址值和原来的保持一致,删除一个元素导致原始list集合元素随之减少 System.out.println("原始:"+userDemoListOld); System.out.println("=====深拷贝list结束====="); } }JsonUtils.java
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JavaType; import com.fasterxml.jackson.databind.ObjectMapper; import java.util.List; /** * 自定义json工具类 */ public class JsonUtils { // 定义jackson对象 private static final ObjectMapper MAPPER = new ObjectMapper(); /** * 将对象转换成json字符串。 * <p>Title: pojoToJson</p> * <p>Description: </p> * * @param data * @return */ public static String objectToJson(Object data) { try { String string = MAPPER.writeValueAsString(data); return string; } catch (JsonProcessingException e) { e.printStackTrace(); } return null; } /** * 将json结果集转化为对象 * * @param jsonData json数据 * @param beanType 对象中的object类型 * @return */ public static <T> T jsonToPojo(String jsonData, Class<T> beanType) { try { T t = MAPPER.readValue(jsonData, beanType); return t; } catch (Exception e) { e.printStackTrace(); } return null; } /** * 将json数据转换成pojo对象list * <p>Title: jsonToList</p> * <p>Description: </p> * * @param jsonData * @param beanType * @return */ public static <T> List<T> jsonToList(String jsonData, Class<T> beanType) { JavaType javaType = MAPPER.getTypeFactory().constructParametricType(List.class, beanType); try { List<T> list = MAPPER.readValue(jsonData, javaType); return list; } catch (Exception e) { e.printStackTrace(); } return null; } }打印信息
=====浅拷贝list开始===== ======原始list集合===== [UserDemo@6f94fa3e, UserDemo@5e481248] =====浅list集合和原始list集合 浅:[UserDemo@6f94fa3e] 原始:[UserDemo@6f94fa3e] =====浅拷贝list结束===== **************** =====深拷贝list开始===== ======原始list集合===== [UserDemo@723279cf, UserDemo@10f87f48] =====深list集合和原始list集合 深:[UserDemo@20322d26] 原始:[UserDemo@723279cf, UserDemo@10f87f48] =====深拷贝list结束=====会发现浅拷贝只是把原始list元素的内存地址值引用了过来,这样对拷贝出来的新集合进行操作的时候就会影响原始的集合,某些业务是不允许这样做的,于是就进行深拷贝。
这种深拷贝写法只是一个思路,得出的结论是:拷贝出来的新集合内的元素的内存地址值是new出来新的,而不是引用旧集合内的元素的,这样既可实现深拷贝list集合。