Java ArrayLIst的add()方法覆盖前面所有值

前两天在写一个导表工具的时候需要用到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.修改其中任何一个,其他的也会被修改。


阅读更多
上一篇java的集合嵌套以及遍历
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭