为什么将全局变量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的值,可以确保对局部变量的修改不会影响到全局变量。这样,全局变量和局部变量引用的就是不同的对象了。