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

Java中LinkedList存储Jobs对象时被覆盖问题求助

问题根源与解决方案

问题原因

你遇到的元素被覆盖问题,核心原因是复用了同一个Jobs对象实例:

  • 在ServerSystem类中,jobStore是类成员变量,只会在ServerSystem实例化时创建一次。
  • 每次收到JOB指令时,你只是修改这个同一个对象的属性值,然后将该对象的引用重复添加到LinkedList中。
  • 由于LinkedList存储的是对象引用,列表中所有元素实际指向的是同一个Jobs实例,最终显示的自然都是最后一次修改的属性值。

解决方案

每次处理JOB指令时,创建新的Jobs对象,确保每个任务都对应独立的实例:

  1. 删除ServerSystem类中的成员变量Jobs jobStore = new Jobs();
  2. 在JOB指令的处理代码块内,每次新建Jobs对象并设置属性,再添加到列表中。

修改后的关键代码

public class ServerSystem extends Thread {

    // 移除类级别的jobStore变量
    JobsManager jobManager = new JobsManager();

    @Override
    public void run() {

        Nodes nodeClass = new Nodes();
        NodesManager nodeManager = new NodesManager();
        
        try {

            boolean repeat = true;

            while (repeat) {
                byte[] packetData = new byte[1024];
                DatagramPacket packet = new DatagramPacket(packetData, packetData.length);
                socket.receive(packet);
                String message = new String(packetData);

                String[] elements = message.trim().split(",");
                switch (elements[0]) {
                    case "JOB":
                        // this is a job
                        System.out.println("---> got a JOB instruction");
                        String jobTime = elements[1];
                        String jobNumber = elements[2];
                        if (Integer.parseInt(jobNumber) >= 11) {
                            System.out.println("-----> Maximum job numbers reached");
                            break;
                        }
                        System.out.println("-----> Job Time = " + jobTime + ", Job Number = " + jobNumber);

                        // 每次创建新的Jobs对象
                        Jobs jobStore = new Jobs();
                        jobStore.setJobNumber(jobNumber);
                        jobStore.setJobTime(jobTime);
                        jobManager.addJob(jobStore);
                        break;
                }
            }
            System.out.println("Blocking incoming traffic...");
        } catch (Exception error) {

        }
    }
}

效果验证

修改后,LinkedList中的每个元素都是独立的Jobs实例,各自保存对应的任务编号和时间,不会再出现被最新值覆盖的情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 16:32:38