通过引用复制对象并替换ArrayList中的所有项



我知道人们以前遇到过这个问题,我也看过以前的帖子。我有一个数组列表,我试着往里面添加对象。在每次add调用期间,都会复制相同的对象引用。虽然我已经使用了'new'操作符,并正在创建新的对象。这是一些基本的东西,当我在每次迭代中再次创建对象时,它已经工作了。非常感谢任何帮助。这是我的代码。

public List<Actor> readAllActors()
{
    String selectMovie = "SELECT * from ACTOR;";
    List<Actor> listOfActors = new ArrayList<Actor>();
    try {           
        statement = conn.prepareStatement(selectMovie);
        results = statement.executeQuery(selectMovie);      
                    Actor a = new Actor();
        while (results.next())
        {                  
                       a = getActorFromResult(results);
                       listOfActors.add(new Actor(a.getId(), a.getFirstName(), a.getLastName(), a.getDateOfBirth()));                               
        }
    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }       
    return listOfActors;    
}
private Actor getActorFromResult(ResultSet results) throws SQLException {
    // TODO Auto-generated method stub
    int id = results.getInt("id");
    String fname = results.getString("firstName");
    String lname = results.getString("lastName");
    String dob = results.getString("dateOfBirth");
    Actor actor = new Actor(id, fname, lname, dob );        
    return actor;
}

我已经尝试在每次迭代中打印对象。它正在从表中获取正确的行。新的Actor()在创建新的对象引用时似乎没有效果!!

你的代码很好,不能总是传递相同的引用。您可以通过对所列对象的==检查来检查它。

你可以将你的代码重构为

results = statement.executeQuery(selectMovie);      
while (results.next())
{          
    listOfActors.add(getActorFromResult(results));                    
}

,因为您正在创建一个新的Actor,从而在获取结果集后创建一个具有自己引用的新对象。这也将使这里的代码更清晰。

return new Actor(id, fname, lname, dob );也将在您的结果方法中完成工作。无论如何,您不会使用自描述的局部变量。

我怀疑你的问题在于你的数据库。

尝试改变这一行

listOfActors.add(new Actor(a.getId(), a.getFirstName(), a.getLastName(), a.getDateOfBirth()));

listOfActors.add(getActorFromResult(results));

和删除行

a = getActorFromResult(results);

你的引用肯定是不一样的,请检查它在调试器

最新更新