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

