为什么将全局变量kyzIdList的值赋值给局部变量list ,然后去改变局部变量的值,全局变量kyzIdList也跟着变了

为什么将全局变量kyzIdList的值赋值给局部变量list ,然后去改变局部变量的值,全局变量kyzIdList也跟着变了?

@RestController
@RequestMapping("homePage")
public class TestController implements ApplicationRunner {
    private static final List<String> kyzIdList = new ArrayList<>();

    @Override
    public void run(ApplicationArguments args) throws Exception {
         getKyzIdList();
    }

    @RequestMapping("electric")
    public void electric(@RequestParam Map<String, Object> params) {
        List<String> list = kyzIdList;
        for (int i = 0; i < list .size(); i++) {
            String s = list .get(i);
            if (s.equals("1")) {
                list .remove(i);
                i--;
            }
        }
    }
        private final List<String> getKyzIdList () {
            //ArrayList<String> list = new ArrayList<>();
            kyzIdList.add("1");
            kyzIdList.add("2");
            kyzIdList.add("3");
            kyzIdList.add("4");
            kyzIdList.add("5");
            //kyzIdList=list;
            return kyzIdList;
        }
    }

内存地址一样
你的银行卡不管是绑定了支付宝,还是微信,只要有消费,钱包里的钱就会变,支付宝/微信就相当于你的定义,钱就相当于你的内存地址

因为他俩的内存地址一样,两个变量指向的是同一个对象,你无论改那个,实际上改的都是一个对象

【以下回答由 GPT 生成】

问题原因:这种情况是因为在Java中,对象赋值实际上是将对象的引用赋给了变量。所以当你将全局变量kyzIdList的值赋给了局部变量list时,它们引用了同一个对象。

解决方案:如果你想要对局部变量进行修改而不影响全局变量,可以创建一个新的ArrayList对象,并将全局变量的值复制到新的ArrayList中。这样,局部变量和全局变量将引用不同的对象,互相之间的修改就不会相互影响了。

以下是修改后的代码示例:

@RestController
@RequestMapping("homePage")
public class TestController implements ApplicationRunner {
    private static final List<String> kyzIdList = new ArrayList<>();

    @Override
    public void run(ApplicationArguments args) throws Exception {
        getKyzIdList();
    }

    @RequestMapping("electric")
    public void electric(@RequestParam Map<String, Object> params) {
        List<String> list = new ArrayList<>(kyzIdList); // 创建新的ArrayList,并复制kyzIdList的值
        for (int i = 0; i < list.size(); i++) {
            String s = list.get(i);
            if (s.equals("1")) {
                list.remove(i);
                i--;
            }
        }
    }

    private final List<String> getKyzIdList() {
        kyzIdList.add("1");
        kyzIdList.add("2");
        kyzIdList.add("3");
        kyzIdList.add("4");
        kyzIdList.add("5");
        return kyzIdList;
    }
}

通过创建新的ArrayList对象并复制kyzIdList的值,可以确保对局部变量的修改不会影响到全局变量。这样,全局变量和局部变量引用的就是不同的对象了。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^