Java 通过引用复制对象并替换ArrayList中的所有项
我知道人们以前也遇到过这个问题,我也看过以前的帖子。 我有一个arrayList,我正在尝试向其中添加对象。在每次添加调用期间,都会复制相同的对象引用。虽然我已经使用了“new”操作符并正在创建新对象。这是一些基本的东西,以前我在每次迭代中再次创建对象时都会用到。 非常感谢您的帮助。 这是我的密码Java 通过引用复制对象并替换ArrayList中的所有项,java,arraylist,Java,Arraylist,我知道人们以前也遇到过这个问题,我也看过以前的帖子。 我有一个arrayList,我正在尝试向其中添加对象。在每次添加调用期间,都会复制相同的对象引用。虽然我已经使用了“new”操作符并正在创建新对象。这是一些基本的东西,以前我在每次迭代中再次创建对象时都会用到。 非常感谢您的帮助。 这是我的密码 public List<Actor> readAllActors() { String selectMovie = "SELECT * from ACTOR;"; List
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;
}
public List readAllActors()
{
String selectMovie=“SELECT*from ACTOR;”;
List listOfActors=new ArrayList();
试试{
语句=conn.prepareStatement(选择电影);
结果=statement.executeQuery(选择电影);
参与者a=新参与者();
while(results.next())
{
a=getActorFromResult(结果);
添加(新参与者(a.getId()、a.getFirstName()、a.getLastName()、a.getDateOfBirth());
}
}捕获(SQLE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
返回登录者;
}
私有参与者getActorFromResult(ResultSet results)引发SQLException{
//TODO自动生成的方法存根
int id=results.getInt(“id”);
String fname=results.getString(“firstName”);
String lname=results.getString(“lastName”);
String dob=results.getString(“出生日期”);
参与者=新参与者(id、fname、lname、dob);
回归演员;
}
我尝试在每次迭代中打印对象。它正在从表中获取正确的行。。新的Actor()在创建新的对象引用时似乎没有效果 试着改变那条线
listOfActors.add(新参与者(a.getId()、a.getFirstName()、a.getLastName()、a.getDateOfBirth())代码>
到那
添加(getActorFromResult(results))代码>
并删除行
a=getActorFromResult(结果)代码>
您的引用肯定不相同,请在debugger中进行检查。您的代码很好,无法始终传递相同的引用。您可以通过==检查列出的对象来检查它
您可以重构代码以
results = statement.executeQuery(selectMovie);
while (results.next())
{
listOfActors.add(getActorFromResult(results));
}
当您创建一个新的Actor
并因此在获取结果集后创建一个具有自己引用的新对象时。这也将使这里的代码更清晰
还返回新的参与者(id、fname、lname、dob)
将在结果方法中执行此任务。无论如何,您没有使用自描述性局部变量
我怀疑你的问题在于你的数据库。尝试使用数据库工具查询它。为什么不使用“listOfActors.add(a)”而不是您正在使用的行?如果您想要具有相同属性的新对象,可能需要使用“克隆”方法。您如何知道它是相同的对象引用?您的对象分配无效,listOfActors.add(getActorFromResult(results))代码>已足够。这里绝对不是同一个对象,因为您在方法中分配了它。。从逻辑上讲,它应该是有效的!我以前已经通过创建一个新对象并返回来纠正这个问题!数据库每次都返回唯一的actor对象。。我已经通过在这个步骤之后打印参与者的字段来验证了这一点:a=getActorFromResult(results);唯一的问题是在arraylist.add()的第二次迭代之后。。第二个对象也将替换第一个对象@user1947288所以listOfActors.size()
返回1,尽管有多个迭代?不,列表大小是4(因为我的表中有四行)。。将添加所有四个参与者对象。。但是他们都是一样的。。i、 e它们都是最后添加的对象。.您可能希望将ResultSet results
作为参数删除,因为您已经在类中定义了。正常情况下,这不是问题,但实际上这是我能想象到的最后一件事…:/(您也没有关闭结果集,是吗?)关闭结果集会有问题吗?当我一步一步地浏览代码时,我可以看到第一个对象被正常地添加到列表中。。第二次调用list.add(A)时。。这两个对象都是第二个对象。。第三次,所有3个都是第3个对象,以此类推……在我复杂化return语句之前,我先返回listOfActors.add(getActorFromResult(results))!我已使用调试器单步执行。。getActorFromResult每次都返回一个唯一的对象。。ArrayList.add()中的代码出错