List的复制
2021/11/8 周一
菜鸟程序员,很多知识点和坑之前学过,但实际用的时候却容易忽略。因为这个问题我在其他地方找了好久BUG,最后看到输出地址,才突然意识到这是引用传递,原来问题出在List的复制。
1. 结论:
-
直接用 newList = oldList 是引用传递,复制的是地址!!!!!!!
改变oldList里的内容同样也会影响到newList -
值传递可以用Collections.copy(newList, oldList)
但需要两个List的大小一样,即复制前还需要给newList指定长度 -
我认为值传递更方便的是newList.addAll(oldList)
2. 业务需求:
需要把readyData放到DataTable里以便前端展示,但readyData是个全局变量,显示完要清空,免得保留到下次又显示了。
3. 过程:
于是就用一个临时的List即showData,来保存readyData里的内容,然后再清空readyData:
public TableDataInfo getActivationList(){
List<ActivationForm> showData = readyData; // 引用传递
readyData.removeAll(readyData); // 清空List
System.out.println(showData);
return getDataTable(showData);
}
但每次showData都没有内容,因为showData指向的还是readyData,而readyData被清空了
正确的复制应该是:
public TableDataInfo getActivationList(){
List<ActivationForm> showData = new ArrayList<ActivationForm>();
showData.addAll(readyData); // 值传递
readyData.removeAll(readyData); // 清空List
System.out.println(showData);
return getDataTable(showData);
}