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.修改其中任何一个,其他的也会被修改。