Java 列表仅存储最后添加的值

Java 列表仅存储最后添加的值,java,Java,我对以下代码有问题: 首先,我有一个内部类: public class TraceMessage{ private String messageType; private String tracedIdentifier; private List<String> content; TraceMessage(){ content = new ArrayList<String>();

我对以下代码有问题:

首先,我有一个内部类:

public class TraceMessage{
        private String messageType;
        private String tracedIdentifier;
        private List<String> content;



        TraceMessage(){
            content = new ArrayList<String>();
            messageType="";
            tracedIdentifier="";
        }

        TraceMessage(String messageType, String identifier ,List<String> content){
            this.messageType = messageType;
            this.tracedIdentifier = identifier;   
            this.content = content;
        }
其中temp是TraceMessage对象

所以我的问题是,当我向列表中添加这样的消息类型对象时,值很好,我甚至将printout输出到构造函数中,它也显示了良好的值。但后来当我试图使用该列表时,列表中的所有元素都有相同的内容(最后一个)。有什么问题吗

以下是我添加消息的完整部分:

private List<TraceMessage> messages = new ArrayList<TraceMessage>();
String fileName="tracefile.MTR";
        BufferedReader br = new BufferedReader(new FileReader(fileName));
        try {   
            String line;
            TraceMessage temp = new TraceMessage();
            while ((line=br.readLine()) != null) {
                if(line.contains("MSCi")){
                     temp.content.clear();
                     temp.content.add(line);
                }
                else if(line.contains("CALL PHASE")){
                     temp.messageType = line.substring(60);
                     temp.content.add(line);
                }

                else if(line.contains("CALL ID")){
                     temp.tracedIdentifier = line.substring(22);
                     temp.content.add(line);
                }
                else if(line.contains("END OF REPORT")){
                    temp.content.add(line); 
                    messages.add(new TraceMessage(temp.messageType,temp.tracedIdentifier,temp.content));          
                }
                else{
                    temp.content.add(line);
                }


            }   

        } finally {
            br.close();



        } 

我会重写第二个构造函数来复制列表

TraceMessage(String messageType, String identifier ,List<String> content){
    this.messageType = messageType;
    this.tracedIdentifier = identifier;   
    this.content = new ArrayList<String>(content);
}
TraceMessage(字符串消息类型、字符串标识符、列表内容){
this.messageType=messageType;
this.traceIdentifier=标识符;
this.content=新的ArrayList(content);
}

这将复制您在
循环中重复使用的
临时内容。实例将不会在类外对内容集合执行操作。

put
TraceMessage temp=new-TraceMessage()
在while循环中

并更改
messages.add(新的TraceMessage(临时消息类型、临时TraceIdentifier、临时内容))

消息。添加(临时)

好吧,如果你不能做到的话

替换
messages.add(新的TraceMessage(临时消息类型、临时TraceIdentifier、临时内容))
具有

消息。添加(临时);消息=新的TraceMessage()

如下更改代码:

...
try {   
    String line;

    List<String> content = new ArrayList<String>();
    String messageType = "";
    String tracedIdentifier = "";

    while ((line=br.readLine()) != null) {
        if (line.contains("MSCi")){
            content.clear();
            content.add(line);
        }
        else if (line.contains("CALL PHASE")) {
            messageType = line.substring(60);
            content.add(line);
        }
        else if (line.contains("CALL ID")) {
            tracedIdentifier = line.substring(22);
            content.add(line);
        }
        else if (line.contains("END OF REPORT")) {
            content.add(line); 
            messages.add(new TraceMessage(messageType, tracedIdentifier, content);          
        }
        else {
            content.add(line);
        }
    }   
} finally {
    br.close();
}
。。。
试试{
弦线;
列表内容=新建ArrayList();
字符串messageType=“”;
字符串TraceIdentifier=“”;
而((line=br.readLine())!=null){
如果(第行包含(“MSCi”)){
content.clear();
内容。添加(行);
}
else if(行包含(“呼叫阶段”)){
messageType=line.substring(60);
内容。添加(行);
}
else if(行包含(“调用ID”)){
TraceIdentifier=行子字符串(22);
内容。添加(行);
}
else if(第行包含(“报告结束”)){
内容。添加(行);
添加(新的TraceMessage(messageType、TraceIdentifier、content);
}
否则{
内容。添加(行);
}
}   
}最后{
br.close();
}

不要使用
temp
对象,而是将属性保存在外部变量中(不在while循环中)然后用这些变量将一个新对象添加到
消息列表中。

如果
temp
已经是
TraceMessage
对象,为什么不直接将其添加到
消息列表中?:
消息。添加(temp)
问题很可能是您没有在这里向我们展示真实的代码,并且您实际上多次添加了相同的对象。您能给我们展示一个复制问题的自包含测试吗?您总是得到相同的对象温度。@maqjav我怀疑这就是问题所在。我添加了您要求的代码部分。内容没有当我添加相同的值时,我确信我在添加之前打印了它,它显示了正确的值我不能真正将它放入循环中,因为如果我将它放入其中一个块(if/else),其他块就看不到它
...
try {   
    String line;

    List<String> content = new ArrayList<String>();
    String messageType = "";
    String tracedIdentifier = "";

    while ((line=br.readLine()) != null) {
        if (line.contains("MSCi")){
            content.clear();
            content.add(line);
        }
        else if (line.contains("CALL PHASE")) {
            messageType = line.substring(60);
            content.add(line);
        }
        else if (line.contains("CALL ID")) {
            tracedIdentifier = line.substring(22);
            content.add(line);
        }
        else if (line.contains("END OF REPORT")) {
            content.add(line); 
            messages.add(new TraceMessage(messageType, tracedIdentifier, content);          
        }
        else {
            content.add(line);
        }
    }   
} finally {
    br.close();
}