字符串数组列表覆盖自身

这里有第一个问题,完整的新手,所以尽量放轻松。 我想弄清楚这里有什么问题:

public List idOnlyQuery(String searchTerm, Connection conn){ List result = new ArrayList(); String[] rowResult = new String[7]; Statement stmt = null; try { stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery( "SELECT * FROM Jets WHERE CurrentID LIKE '" + searchTerm + "%'"); while(rs.next()){ String currentId= rs.getString("CurrentId"); String manufacturer = rs.getString("Constructor"); String type = rs.getString("ACType"); String series = rs.getString("Series"); String index = rs.getString("KeyNo"); String operator = rs.getString("Operator"); String baseAirport = rs.getString("Home_Airfield"); rowResult[0] = (currentId); rowResult[1] = (manufacturer); rowResult[2] = (type); rowResult[3] = (series); rowResult[4] = (operator); rowResult[5] = (baseAirport); rowResult[6]= (index); result.add(rowResult); } System.out.println(result.get(0)[0]); 

此方法返回字符串数组列表,这些数组是从SQLite数据库中检索的。 除了我的结果List中的字符串数组似乎每次while循环重复时都被覆盖的事实之外,一切都有效。 最后一个println总是给我从数据库中检索的最后一行的currentId ,但是如果我在while循环中放入一个println while它会在每个循环中返回相应的数据。 我真的无法弄清楚我的String[]元素被覆盖的位置。 它可能非常明显,但我花了几个小时在网上查看我是否正确地进行了添加程序,但仍然没有快乐。 帮帮我!

您需要在循环中创建rowResult数组。 您的列表只包含指向数组的指针,您基本上只使用一个实例。

在使用rowResult = new String[7]; 每次初始化之前。

这是因为,数组是Java中的对象,所以基本上你一次又一次地改变同一个对象的值。

这是因为你要重新分配数组位置:

  rowResult[0] = (currentId); rowResult[1] = (manufacturer); rowResult[2] = (type); rowResult[3] = (series); rowResult[4] = (operator); rowResult[5] = (baseAirport); rowResult[6]= (index); 

在while循环中创建一个临时String数组,并将其添加到result

 while (rs.next()) { String[] rowResult = new String[7]; .. // do your stuff result.add(rowResult); } 

每次while循环执行时,它都会将其添加到result ,然后重新开始。

您对所有行使用相同的rowResult数组。 放线

 String[] rowResult = new String[7]; 

在while循环中,一切都会正常工作。

您正在覆盖rowResult对象。 您必须创建一个新的,填充它并在每次迭代时将其添加到列表中。 你做的就像拿一个篮子,把它装满橙子并放在架子上,然后取出同样的篮子,把橘子扔出来放入新的。

 public List idOnlyQuery(String searchTerm, Connection conn){ List result = new ArrayList(); Statement stmt = null; try { stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery( "SELECT * FROM Jets WHERE CurrentID LIKE '" + searchTerm + "%'"); while(rs.next()){ String[] rowResult = new String[7]; rowResult[0] = rs.getString("CurrentId"); rowResult[1] = rs.getString("Constructor"); rowResult[2] = rs.getString("ACType"); rowResult[3] = rs.getString("Series"); rowResult[4] = rs.getString("Operator"); rowResult[5] = rs.getString("Home_Airfield"); rowResult[6] = rs.getString("KeyNo"); result.add(rowResult); } System.out.println(result.get(0)[0]); } catch (Exception e) {} } 

你一遍又一遍地重写String数组。 尝试在每个循环中创建一个新数组。

 List result = new ArrayList(); String[] rowResult; Statement stmt = null; try { stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery( "SELECT * FROM Jets WHERE CurrentID LIKE '" + searchTerm + "%'"); while(rs.next()){ rowResult = new String[7]; //Create a new object String currentId= rs.getString("CurrentId"); //... } 

这是因为当你这样做时:

 rowResult = new String[7]; //Create a new object 

此变量指向内存中的对象:

 rowResult -------------> new String[7] 

因此,如果我循环遍历结果集并使用rowResult进行编写,我确实只修改了一个对象(通过每次添加它到列表中,您只有很多变量指向同一个对象):

 result.get(0) -------------->| result.get(1)--------------->| String[7] result.get(n)--------------->| 

当通过new运算符创建循环中的新数组时,您确实有一个新的新对象可以使用:

 result.get(0) -------------->| String[7] result.get(1)--------------->| String[7] result.get(n)--------------->| String[7]