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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 05:52:44