You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java ArrayList循环打印重复显示最后一个对象问题求助

Java集合遍历重复打印最后一个对象的问题解决

问题现象

在LogAnalyzer的readFiles()方法中,将解析后的LogEntry对象添加到ArrayList后,遍历集合时,尽管集合大小为7,但所有输出都是最后一个LogEntry的信息。

问题根源

LogEntry类的成员变量被错误声明为static。静态变量属于类本身而非实例对象,每次创建新的LogEntry实例时,都会覆盖类级别的静态变量值,导致所有LogEntry实例共享同一组变量数据,最终所有实例的toString()方法都会输出最后一次赋值的内容。

修复方案

移除LogEntry类中所有成员变量和getter方法的static修饰符,将其改为实例变量和实例方法:

import java.util.Date;

public class LogEntry {
    // 移除static,改为实例变量
    private String ipAddress;
    private String request;
    private int statusCode;
    private int bytesReturned;
    private Date accessTime;

    public LogEntry(String ip, String req, int stCode, int bytes, Date accTime) {
        ipAddress = ip;
        request = req;
        statusCode = stCode;
        bytesReturned = bytes;
        accessTime = accTime;
    }

    // 移除static,改为实例方法
    public String getIp() {
        return ipAddress;
    }

    public String getRequest() {
        return request;
    }

    public int getStatusCode() {
        return statusCode;
    }

    public int getBytesReturned() {
        return bytesReturned;
    }

    public Date getAccessTime() {
        return accessTime;
    }

    public String toString() {
        return ipAddress + " " + request + " " + statusCode + " " + accessTime + " " + bytesReturned;
    }
}

额外优化建议

LogAnalyzer类中的records集合和readFiles()方法也使用了static,这会导致该类无法被实例化多次(多次实例化会共享同一个records集合)。如果需要支持多实例场景,建议移除static修饰符,改为实例成员:

import java.io.FileNotFoundException;
import java.util.ArrayList;

public class LogAnalyzer {
    // 移除static,改为实例变量
    private ArrayList<LogEntry> records;
    // 若ReadJavaDoc无需全局共享,也可改为实例变量
    private ReadJavaDoc obj = new ReadJavaDoc();

    public LogAnalyzer() {
        records = new ArrayList<LogEntry>();
    }

    // 移除static,改为实例方法
    public void readFiles(String str) throws FileNotFoundException {
        for (String s : obj.linesOfFile(str)) {
            LogEntry entry = WebLogParser.parseEntry(s);
            records.add(entry);
        }

        for (LogEntry i : records) {
            System.out.println(i);
        }
    }
    
    public static void main(String[] args) throws FileNotFoundException {
        LogAnalyzer analyzer = new LogAnalyzer();
        analyzer.readFiles(filePath);
    }
}

内容的提问来源于stack exchange,提问作者Archismita

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 14:24:57