ArrayList值是否被覆盖?

时间:2018-03-17 10:21:12

标签: java

我正在使用数组字符串列表从数据库中读取值,每次我读取新行时它都会覆盖旧行,为什么会这样呢? 这是我的代码。

List<String[]> table = new ArrayList<>();
Statement statement = dbConnection.createStatement();
ResultSet resultSet = statement.executeQuery(query);
int columnCount = resultSet.getMetaData().getColumnCount();
String[] row = new String[columnCount];
while(resultSet.next()) {
    for(int i = 0; i < columnCount; ++i) {
        row[i] = resultSet.getString(i + 1);
    }
    table.add(row);
}

要返回的预期结果是

+-------------+-------------+-------------+
| row 1 col 1 | row 1 col 2 | row 1 col 3 |
+-------------+-------------+-------------+
| row 2 col 1 | row 2 col 2 | row 2 col 3 |
+-------------+-------------+-------------+

虽然我得到了这个结果

+-------------+-------------+-------------+
| row 2 col 1 | row 2 col 2 | row 2 col 3 |
+-------------+-------------+-------------+
| row 2 col 1 | row 2 col 2 | row 2 col 3 |
+-------------+-------------+-------------+

但如果我使用此代码块,则问题正在解决,数据将按预期返回。

List<String[]> table = new ArrayList<>();
Statement statement = dbConnection.createStatement();
ResultSet resultSet = statement.executeQuery(query);
int columnCount = resultSet.getMetaData().getColumnCount();
while(resultSet.next()) {
    String[] row = new String[columnCount];
    for(int i = 0; i < columnCount; ++i) {
        row[i] = resultSet.getString(i + 1);
    }
    table.add(row);
}

1 个答案:

答案 0 :(得分:1)

在第一个示例代码段中,您将构建一个String数组,在while循环的每次迭代中连续将相同的引用添加到累加器列表中。 / p>

因此,您将相同的字符串数组引用添加到累加器列表columnCount次数,并且它们都引用内存中的相同对象。这就是您收到意外结果的原因。

另一方面,第二个示例代码片段在while循环的每次迭代中构造一个新的不同字符串数组,从而接收预期的结果。