gpt4 book ai didi

java - java中修改列表会影响另一个列表

转载 作者:行者123 更新时间:2023-12-02 08:59:22 25 4
gpt4 key购买 nike

我在java中修改列表时遇到问题,我想用foreach更改listTempEnemy中的值,然后按我想要的方式更改值,但它有影响到 listEnemy 不应更改,这是我的代码,谢谢。

public void hunt() {
Enemy enemy = new Enemy();
enemy.setEnemyName("Poring");
enemy.setEnemyMinATK(10);
enemy.setEnemyMaxATK(20);
listEnemy.add(enemy);

List<Enemy> listTempEnemy = new ArrayList<Enemy>();
listTempEnemy.addAll(listEnemy);

for (Enemy enm : listEnemy) {
System.out.println("Before "+ enm.getEnemyMinATK() + " | " + enm.getEnemyMaxATK());
}

for (Enemy enm : listTempEnemy) {
enm.setEnemyMinATK((enm.getEnemyMinATK() * 10/100) + enm.getEnemyMinATK());
enm.setEnemyMaxATK((enm.getEnemyMaxATK() * 10/100) + enm.getEnemyMaxATK());
System.out.println("Value Changed "+ enm.getEnemyMinATK() + " | " + enm.getEnemyMaxATK());
}

for (Enemy enm : listEnemy) {
System.out.println("After "+ enm.getEnemyMinATK() + " | " + enm.getEnemyMaxATK());
}
}

结果是

2020-02-18T17:02:33.843+0700|Info: Before 10 | 20
2020-02-18T17:02:33.843+0700|Info: Value Changed 11 | 22
2020-02-18T17:02:33.843+0700|Info: After 11 | 22

然后我改变了我的代码

private List<Enemy> loadEnemy() {
List<Enemy> listEnemy = new ArrayList<Enemy>();

Enemy enemy = new Enemy();
enemy.setEnemyName("Poring");
enemy.setEnemyHP(100);
enemy.setEnemyMinATK(10);
enemy.setEnemyMaxATK(20);
listEnemy.add(enemy);

return listEnemy;
}

public void hunt() {
List<Enemy> listTempEnemy = loadEnemy();

for (Enemy enm : listEnemy) {
System.out.println("Before "+ enm.getEnemyMinATK() + " | " + enm.getEnemyMaxATK());
}

for (Enemy enm : listTempEnemy) {
enm.setEnemyMinATK((enm.getEnemyMinATK() * 10/100) + enm.getEnemyMinATK());
enm.setEnemyMaxATK((enm.getEnemyMaxATK() * 10/100) + enm.getEnemyMaxATK());
System.out.println("Changed Value " + enm.getEnemyMinATK() + " | " + enm.getEnemyMaxATK());
}

for (Enemy enm : listEnemy) {
System.out.println("After "+ enm.getEnemyMinATK() + " | " + enm.getEnemyMaxATK());
}
}

这就是我想要的结果

2020-02-18T17:46:36.387+0700|Info: Before 10 | 20
2020-02-18T17:46:36.387+0700|Info: Changed Value 11 | 22
2020-02-18T17:46:36.387+0700|Info: After 10 | 20

最佳答案

您已将相同的对象(堆(内存)中同一对象的指针/引用)添加到两个单独的列表中。当您更改一个列表中的对象时,另一个列表中的对象也会更改,因为它们都是同一个对象。这就是为什么不可变对象(immutable对象)更可取,因为这类错误很难发现(如果您有很多复杂的逻辑......例如哪个类正在改变对象?)。对于列表 1 和列表 2,您需要对象的 2 个副本

关于java - java中修改列表会影响另一个列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60277778/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com