Java 覆盖自身的字符串数组列表

Java 覆盖自身的字符串数组列表,java,arrays,string,Java,Arrays,String,这里的第一个问题,完全是新手,所以试着对我放松点。我正试图找出这里出了什么问题: public List<String[]> idOnlyQuery(String searchTerm, Connection conn){ List<String[]> result = new ArrayList<String[]>(); String[] rowResult = new String[7]; Statement stmt = nu

这里的第一个问题,完全是新手,所以试着对我放松点。我正试图找出这里出了什么问题:

public List<String[]> idOnlyQuery(String searchTerm, Connection conn){

    List<String[]> result = new ArrayList<String[]>();
    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]);
公共列表idOnlyQuery(字符串搜索项,连接连接){
列表结果=新建ArrayList();
String[]rowResult=新字符串[7];
语句stmt=null;
试一试{
stmt=conn.createStatement();
ResultSet rs=stmt.executeQuery(“从当前ID类似于“'+searchTerm+“%”的Jet中选择*”;
while(rs.next()){
字符串currentId=rs.getString(“currentId”);
字符串制造商=rs.getString(“构造函数”);
字符串类型=rs.getString(“ACType”);
字符串系列=rs.getString(“系列”);
字符串索引=rs.getString(“KeyNo”);
字符串运算符=rs.getString(“运算符”);
字符串baseAirport=rs.getString(“Home_Airfield”);
rowResult[0]=(当前ID);
rowResult[1]=(制造商);
rowResult[2]=(类型);
rowResult[3]=(系列);
rowResult[4]=(运算符);
rowResult[5]=(baseAirport);
rowResult[6]=(索引);
result.add(rowResult);
}
System.out.println(result.get(0)[0]);

此方法返回字符串数组列表,这些数组从SQLite数据库中检索。除了每次while循环重复时,我的result
list
中的字符串数组似乎都会被覆盖之外,所有操作都有效。最后一个
println
始终为我提供最后一个
currentId
从数据库中检索到的行,但如果我在
while
循环中放入
println
,它会在每个while循环中返回相应的数据。我真的不知道我的
字符串[]
元素被覆盖。这可能非常明显,但我花了数小时在线查看是否正确执行了添加过程,仍然没有任何乐趣。帮助!

这是因为您正在重新分配阵列位置:

  rowResult[0] = (currentId);
  rowResult[1] = (manufacturer);
  rowResult[2] = (type);
  rowResult[3] = (series);
  rowResult[4] = (operator);
  rowResult[5] = (baseAirport);
  rowResult[6]= (index);
在while循环中创建一个临时
字符串
数组,并将其添加到
结果中

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

每次执行
while
循环时,它都会将它添加到
结果中,您将重新开始。

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

在while use use
rowResult=new String[7];
每次初始化之前


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

你正在覆盖你的rowResult对象。你必须创建一个新的对象,填充它,并在每次迭代中将其添加到列表中。你所做的就像拿一个篮子,装满桔子,放在架子上,然后拿同样的ba斯基特,把桔子扔出去,放进新的

public List<String[]> idOnlyQuery(String searchTerm, Connection conn){

    List<String[]> result = new ArrayList<String[]>();

    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) {}
}
公共列表idOnlyQuery(字符串搜索项,连接连接){
列表结果=新建ArrayList();
语句stmt=null;
试一试{
stmt=conn.createStatement();
ResultSet rs=stmt.executeQuery(“从当前ID类似于“'+searchTerm+“%”的Jet中选择*”;
while(rs.next()){
String[]rowResult=新字符串[7];
rowResult[0]=rs.getString(“CurrentId”);
rowResult[1]=rs.getString(“构造函数”);
rowResult[2]=rs.getString(“ACType”);
rowResult[3]=rs.getString(“系列”);
rowResult[4]=rs.getString(“运算符”);
rowResult[5]=rs.getString(“Home_Airfield”);
rowResult[6]=rs.getString(“KeyNo”);
result.add(rowResult);
}
System.out.println(result.get(0)[0]);
}
捕获(例外e){}
}

您对所有行使用相同的rowResult数组。请将

String[] rowResult = new String[7];

在while循环中,一切正常。

您正在一次又一次地覆盖字符串数组。请尝试在每个循环中创建一个新数组

List<String[]> result = new ArrayList<String[]>();
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] 
因此,如果我在结果集上循环并使用rowResult写入,我实际上只修改了一个对象(通过每次将其添加到列表中,您只有很多变量指向同一个对象):

当通过new运算符在循环中创建新数组时,您确实有一个新的对象要处理:

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

@Batty先生,你太棒了,它很管用!如果你不介意扩展这一行,为什么这一行是必要的?这是必要的,因为你需要在将信息写入之前初始化一个新数组。你只需要在没有初始化的情况下覆盖当前数组。谢谢大家!现在有意义了!我有很多东西要学习…你们都已经知道了省得我头疼!谢谢!那就接受答案吧;)
result.get(0) -------------->|
result.get(1)--------------->| String[7] 
result.get(n)--------------->|
result.get(0) -------------->| String[7]
result.get(1)--------------->| String[7] 
result.get(n)--------------->| String[7]