前两天在写一个导表工具的时候需要用到ArrayList嵌套集合,可是在用add方法将数据存入集合的时候遇到一些问题:每存入一个值得时候,前面所有的值都被最新值给覆盖掉。
List<ArrayList<string>> bigList = new ArrayList<>();//全局变量
ArrayList<String> rowList = new ArrayList<>();
ResultSet resultSet1 = transferDataDao.DataList(connection,transferData);
while(resultSet1.next()) {
int devId = resultSet1.getInt("DevId");
// String dataTime = resultSet1.getString("DataTime");
values[2] = resultSet1.getString("NowValue"); //特排
String channelValue = resultSet1.getString("NowValue");
// System.out.println("特排:" + channelValue);
if (!channelValue.equals("")) {
rowList.add(channelValue);
}
}
因为rowlist需要多处使用,一开始设置为全局变量,导致每次使用add方法插入的时候,覆盖前面的值。
解决方法:将rowList设置为局部变量即可。
由于这个问题困扰了我好长时间,所以我在解决这个问题的时候,整理了其他两个可能使用ArrayList.add()方法导致覆盖前面值得两种可能,一并整理如下:
1.ArrayList.add方法添加的是对象的引用
解决方法:把实例化对象的语句放在while循环内。如TransferData data = new TransferData();放在while循环内
如果放在while循环外,那么创建的引用只有一个,while循环内一直在改变对象的变量,直到while循环结束,而add方法添加的引用始终是不变的。如果放在while循环内,则相当于每次循环都创建一个对象引用,并指向当次循环的对象,各对象引用指向的对象变量值也是不同的。
2.涉及静态变量
private static String id;
private static String value;
ArrayList<TransferData> list = new ArrayList<TransferData>();
TransferData data1 = new TransferData("001", "1111");
TransferData data2 = new TransferData("002", "2222");
//如果输出两个对象,发现两个都是data2
list.add(data1);
list.add(data2);
这种情况虽然每次添加的是不同的对象,但还是被覆盖了。罪魁祸首就是这个static关键字!!!
static关键字:
1.让修饰的属性变为静态
2.该类的所有对象共享同一个属性,所以集合里存的是不同的对象,但属性的值还是同一个。
3.修改其中任何一个,其他的也会被修改。