1 概要

遇到一个取数的过程业务代码段:

1
2
3
4
5
6
// ......
List<T> list1 = xx.getListByParam(param1);
map.put("list1",list1);
List<T> list2 = xx.getListByParam(param2);
map.put("list2", list2);
// ......

其中,list1中,某属性的值,在list2获取的过程中,发生改变。出现问题。

2 Java List 深拷贝的问题

解决方法

1
2
3
4
5
6
7
8
9
10
11
12
13
public static <T> List<T> deepCopy(List<T> list) throws IOException, ClassNotFoundException {

ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream();
ObjectOutputStream objectOutputStream = new ObjectOutputStream(arrayOutputStream);
objectOutputStream.writeObject(list);

ByteArrayInputStream arrayInputStream = new ByteArrayInputStream(arrayOutputStream.toByteArray());
ObjectInputStream objectInputStream = new ObjectInputStream(arrayInputStream);

@SuppressWarnings("unchecked")
List<T> reList = (List<T>) objectInputStream.readObject();
return reList;
}

3 问题分析

代码表现是:

  • Controller类中的两个不同的方法,调用了同一个Serveice类中的方法
  • 这个动作是一个查询动作引起
  • 这个动作到了Controller层,会调用多次、多个Service类的方法

避免出现此问题,导致数据不准确,则需要考虑Java List的深拷贝的问题。

4 分析List的深浅拷贝