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
相关产品推荐
相关产品推荐

