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

如何让Java类的多个实例更新同一个ArrayList?

解决Robot实例共享pendingOrders集合的问题

当前你的Robot类中,pendingOrders是实例变量,每个Robot对象都会创建独立的ArrayList实例,导致r1和r2的集合无法共享。下面提供两种可行的解决方案:

方案一:将pendingOrders声明为静态变量

把pendingOrders定义为static类型,这样所有Robot实例都会共享同一个ArrayList对象:

import java.util.ArrayList;

public class Student{

    static int enrollmentNumber;
    String studentName;

    Student(String name){
        enrollmentNumber += 1;
        studentName = name;
    }

    public String toString(){
        return enrollmentNumber+": "+this.studentName;
    }

    public static void main(String[] args) {

        Student s = new Student("Pam");
        System.out.println(s.toString());
        
        Student s1 = new Student("Hellooo");
        System.out.println(s1.toString());

        Student s2 = new Student("Pam2");
        System.out.println(s2.toString());
        
        Robot r1 = new Robot("Bob");
        r1.addToQueue("yo");
        System.out.println(r1.returnList()); // 输出: [yo]
        
        Robot r2 = new Robot("Rob");
        r2.addToQueue("lo");
        System.out.println(r2.returnList()); // 输出: [yo, lo]
    }
}

class Robot{
    // 修改为static变量,全局共享
    public static ArrayList<String> pendingOrders = new ArrayList<String>();
    String rName;

    Robot(String name){
      rName = name;
    }

    public void addToQueue(String s){
        pendingOrders.add(s);
    }
    
    public ArrayList<String> returnList(){
        return pendingOrders;
    }
}

这种方式简单直接,但所有Robot实例都会强制共享同一个集合,适合全局唯一的共享场景。

方案二:通过构造方法传入共享集合

如果需要更灵活的共享控制(比如让部分Robot共享同一集合,其他Robot用独立集合),可以在Robot构造方法中传入一个预先创建的ArrayList实例:

import java.util.ArrayList;

public class Student{

    static int enrollmentNumber;
    String studentName;

    Student(String name){
        enrollmentNumber += 1;
        studentName = name;
    }

    public String toString(){
        return enrollmentNumber+": "+this.studentName;
    }

    public static void main(String[] args) {

        Student s = new Student("Pam");
        System.out.println(s.toString());
        
        Student s1 = new Student("Hellooo");
        System.out.println(s1.toString());

        Student s2 = new Student("Pam2");
        System.out.println(s2.toString());
        
        // 先创建一个共享的ArrayList
        ArrayList<String> sharedOrders = new ArrayList<>();
        
        Robot r1 = new Robot("Bob", sharedOrders);
        r1.addToQueue("yo");
        System.out.println(r1.returnList()); // 输出: [yo]
        
        Robot r2 = new Robot("Rob", sharedOrders);
        r2.addToQueue("lo");
        System.out.println(r2.returnList()); // 输出: [yo, lo]
    }
}

class Robot{
    public ArrayList<String> pendingOrders;
    String rName;

    // 构造方法接收共享集合
    Robot(String name, ArrayList<String> sharedOrders){
      rName = name;
      this.pendingOrders = sharedOrders;
    }

    public void addToQueue(String s){
        pendingOrders.add(s);
    }
    
    public ArrayList<String> returnList(){
        return pendingOrders;
    }
}

这种方式可以自由指定哪些Robot共享同一个集合,扩展性更强。

注意:如果你的代码涉及多线程环境,需要考虑集合的线程安全性,可以使用CopyOnWriteArrayList或者在操作集合时加锁,避免并发修改异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 23:01:13