【发布时间】:2020-06-02 06:57:56
【问题描述】:
我在 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
【问题讨论】:
-
这就是引用的工作方式。您不会将对象本身传递给方法,而是传递引用。如果调用两个方法,每个方法都接收对同一个对象的引用,则对该对象的更改会反映在两个方法中。
标签: java list arraylist foreach