java深拷贝list集合思路

java深拷贝list集合思路

先上代码

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字符串。
     * 

Title: pojoToJson

*

Description:

* * @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 *

Title: jsonToList

*

Description:

* * @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集合。

你可能感兴趣的:(java)