前段时间出过一个问题,在对一个list(Data是我的自己定的一个实体类)进行操作的时候,想在特定情况下改变list里内容的值。
for (ExcelData data: dataList) {
if (data != null) {
if (data.getV() == null) {
data = list.get(data.getMc().getR()).get(data.getMc().getC());
} else {
data.setMc(null);
}
} else {
data = new ExcelData();
}
newData.add(data);
}
不用太在意V、R、Mc是什么意思,这些是和前端控件对应的名字。要关注的是这里面用到了data.setXXX()方法,这是不对的。
出了问题后打断点发现,如果直接在对list的循环中直接用set()方法改变了其中一个数据的内容,同时也会改变另外一个数据的内容。两个数据是一摸一样的,所以猜测可能是java自己做了优化,从数据库中查出来的数据,如果是相同的数据java用了浅拷贝。
总结:如果要改变对象的数据,尽量new一个新对象,而不是用set方法来赋值。同时注意java可能出现的浅拷贝问题。



