Java中向ArrayList添加对象后元素值全部为最后修改值的原因咨询
为什么ArrayList没有保留第一个对象的初始值?
这是一个非常常见的Java引用类型误区,我来给你拆解一下问题出在哪:
核心原因:你只创建了一个authors对象实例
Java中的对象是引用类型,当你执行authors Authors = new authors();时,只是在内存中创建了一个authors对象,变量Authors保存的是这个对象在内存中的地址(也就是引用)。
你后续的操作都是在修改同一个对象的属性:
- 第一次调用
setAuthId(1)和setAuthName("Roald Dahl")后,把这个对象的引用添加到tabAuthors里,此时列表的第一个元素指向内存中的这个对象。 - 接着你调用
setAuthId(2)和setAuthName("Julia Donaldson"),这其实是直接修改了同一个内存对象的属性值,并没有创建新的对象。 - 第二次把
Authors添加到列表时,只是把同一个引用重复加入,现在列表里的两个元素都指向内存中同一个对象。
所以当你遍历列表时,两次取到的都是这个对象的最新状态——也就是第二次修改后的2 Julia Donaldson。
解决方法
你需要为每个作者创建独立的authors对象实例,这里提供两种常见的实现方式:
方式1:每次添加前新建对象实例
修改main方法,为每个作者单独创建对象:
public static void main(String[] args) { ArrayList<authors> tabAuthors = new ArrayList<authors>(); // 创建第一个作者对象 authors author1 = new authors(); author1.setAuthId(1); author1.setAuthName("Roald Dahl"); System.out.println(author1.toString()); tabAuthors.add(author1); // 创建第二个作者对象 authors author2 = new authors(); author2.setAuthId(2); author2.setAuthName("Julia Donaldson"); System.out.println(author2.toString()); tabAuthors.add(author2); for (int counter = 0; counter < tabAuthors.size(); counter++) { System.out.println(tabAuthors.get(counter).getAuthId() + " " + tabAuthors.get(counter).getAuthName()); } }
方式2:添加带参数的构造方法简化对象创建
先给authors类增加一个带参数的构造方法,这样可以直接在创建对象时初始化属性:
public class authors { private int authId; private String authName; // 新增带参数的构造方法 public authors(int authId, String authName) { this.authId = authId; this.authName = authName; } // 原有的getter、setter和toString方法 public int getAuthId() { return authId; } public void setAuthId(int authId) { this.authId = authId; } public String getAuthName() { return authName; } public void setAuthName(String authName) { this.authName = authName; } @Override public String toString() { return "authors{" + "authId=" + authId + ", authName='" + authName + '\'' + '}'; } }
然后main方法可以更简洁:
public static void main(String[] args) { ArrayList<authors> tabAuthors = new ArrayList<authors>(); // 直接创建并添加新对象 tabAuthors.add(new authors(1, "Roald Dahl")); tabAuthors.add(new authors(2, "Julia Donaldson")); // 使用增强for循环遍历更简洁 for (authors author : tabAuthors) { System.out.println(author.getAuthId() + " " + author.getAuthName()); } }
内容的提问来源于stack exchange,提问作者Danny Braganza
相关产品推荐
相关产品推荐

