我正在使用数组字符串列表从数据库中读取值,每次我读取新行时它都会覆盖旧行,为什么会这样呢? 这是我的代码。
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);
}
答案 0 :(得分:1)
在第一个示例代码段中,您将构建一个String数组,在while循环的每次迭代中连续将相同的引用添加到累加器列表中。 / p>
因此,您将相同的字符串数组引用添加到累加器列表columnCount
次数,并且它们都引用内存中的相同对象。这就是您收到意外结果的原因。
另一方面,第二个示例代码片段在while循环的每次迭代中构造一个新的不同字符串数组,从而接收预期的结果。