Java 是否正在重写ArrayList值?

Java 是否正在重写ArrayList值?,java,Java,每次读取新行时,我都会使用数组字符串列表从数据库中读取值,它会覆盖旧行,为什么会发生这种情况? 这是我的密码 List<String[]> table = new ArrayList<>(); Statement statement = dbConnection.createStatement(); ResultSet resultSet = statement.executeQuery(query); int columnCount = resultSet.getMet

每次读取新行时,我都会使用数组字符串列表从数据库中读取值,它会覆盖旧行,为什么会发生这种情况? 这是我的密码

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 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);
}
List table=new ArrayList();
语句Statement=dbConnection.createStatement();
ResultSet ResultSet=statement.executeQuery(查询);
int columnCount=resultSet.getMetaData().getColumnCount();
while(resultSet.next()){
String[]行=新字符串[columnCount];
对于(int i=0;i
在第一个示例代码片段中,您正在构造一个字符串数组,在while循环的每次迭代中连续地向累加器列表添加相同的引用

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


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

put this
string[]row=new string[columnCount]在第一个while循环中。您能解释一下为什么您认为第一段代码应该产生所需的结果吗?您认为
String[]row=newstring[columnCount]。。。表.添加(行)是吗?@DodgyCodeException我认为第一件作品应该产生预期的结果,但为什么它不是,这就是我为什么要问的原因?我将结果添加到行中,然后将结果添加到表中,所以如果在while内部或外部初始化,结果会是什么?
String[]行=新字符串[columnCount]
为字符串元素创建数组,
table.add(行)添加该数组(可以像第一个示例中那样多次添加)。若您在循环中使用相同的数组,比如
行[i]=…
,那个么您将用新数据替换该数组单元格中以前的数据,但由于列表包含对同一数组的引用,所以在每次迭代中都会看到来自该数组的数据。
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);
}