Java引用ArrayList

Java引用ArrayList,java,reference,new-operator,Java,Reference,New Operator,我有一个要添加对象的ArrayList。使用文本框添加对象 我遇到的问题是,当用户在文本框中输入一个值时,我的ArrayList中的所有条目都采用新值 if(e.getSource() == textbox){ String name = textbox.getText(); NameSurferEntry entry = new NameSurferEntry(); entry = db.findEntry(name);

我有一个要添加对象的ArrayList。使用文本框添加对象

我遇到的问题是,当用户在文本框中输入一个值时,我的ArrayList中的所有条目都采用新值

if(e.getSource() == textbox){
        String name = textbox.getText();            
        NameSurferEntry entry = new NameSurferEntry();
        entry = db.findEntry(name);
        graph.addEntry(entry);
        graph.update();
        textbox.setText("");

    }
要添加条目的代码:

public void addEntry(NameSurferEntry entry) {       
    entryArray.add(entry);          
    }

您正在创建一个新的
NameSurferEntry
,下一行将使用数据库中的值覆盖它。如果返回的条目始终相同,则arraylist将只包含对相同对象的引用

NameSurferEntry entry = new NameSurferEntry();
entry = db.findEntry(name);

你应该考虑的是在你的对象中实现和/或执行<强>防御性复制< /强>。对于简单的属性,声明它们就足够了,但是对于复杂的元素,通常需要通过重新创建来复制对象

鉴于您实现了


这意味着
db.findEntry
始终返回相同的
NameSurferEntry
实例,并将其中的名称替换为作为参数接收的名称

将对象添加到列表中只会添加对列表中对象的引用。它不会克隆对象以将其副本存储在列表中

顺便说一句,如果只是用
db.findEntry
的结果覆盖条目变量,为什么要创建一个
新的NameSurferEntry
并将其分配给条目变量?

不管这是什么:

entry = db.findEntry(name);
包含并返回一个对象,您正在更改它包含的任何内容


更清楚地说:您正在一次又一次地向列表中添加相同的引用,并更改引用所指向的单个对象的内容。

从发布的代码来看,这将很难提供帮助,尽管我怀疑
db.findEntry()
方法。您创建一个新的
NameSurferEntry
然后立即覆盖它的事实也不常见。您在创建一个新的
NameSurferEntry
后立即丢弃它,这是非常可疑的。
findEntry
是如何工作的?它返回什么?基于您发布的代码-您不应该看到这个问题。假设
entryArray
ArrayList
,那么调用
add
方法是在列表末尾创建新元素的正确方法,而无需修改现有元素。您确定您准确地描述了问题吗?如果是这样,那么您必须在某个地方循环ArrayList并将每个值更新为相同的值,这应该是非常明显的。无论如何,你的问题不在你发布的代码范围之内;仔细看看你在列表中调用的内容。我添加了新的NameSurferEntry,希望创建一个新对象,该对象可以放入arraylist中。为了更快获得更好的帮助,请发布一个。这就是我的想法,所以我尝试添加一个“新”NameSurferEntry。我不知道如何将新对象添加到ArrayList中。我以前尝试过添加,但db.findEntry()返回的是NameSurferEntry对象,而不是构造函数所需的字符串。@megisto,您必须实现这样的构造函数,或者实现其他方法将属性从一个对象复制到另一个对象。
entry = db.findEntry(name);