Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过引用复制对象并替换ArrayList中的所有项_Java_Arraylist - Fatal编程技术网

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

Java 通过引用复制对象并替换ArrayList中的所有项,java,arraylist,Java,Arraylist,我知道人们以前也遇到过这个问题,我也看过以前的帖子。 我有一个arrayList,我正在尝试向其中添加对象。在每次添加调用期间,都会复制相同的对象引用。虽然我已经使用了“new”操作符并正在创建新对象。这是一些基本的东西,以前我在每次迭代中再次创建对象时都会用到。 非常感谢您的帮助。 这是我的密码 public List<Actor> readAllActors() { String selectMovie = "SELECT * from ACTOR;"; List

我知道人们以前也遇到过这个问题,我也看过以前的帖子。 我有一个arrayList,我正在尝试向其中添加对象。在每次添加调用期间,都会复制相同的对象引用。虽然我已经使用了“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;
}
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()中的代码出错