一. 先说结论
- forEach语句可以修改集合/数组元素为对象的值,但不可以修改数组元素为变量的值。
- forEach语句不能在集合/数组中添加或删除对象。
二. 问题复现
1. 数组元素为变量
- 结论:当数组元素为变量时,forEach循环不能修改原数据。如果想修改,只能通过正规for循环。
- forEach循环修改数组元素
public class VariableTest {
public static void main(String[] args) {
// 定义数组
int[] variables = new int[]{1,2,3,4,5};
// forEach循环遍历数组
for(int var:variables){
if(var==3){
var = 0;
}
}
// 输出数组结果
for(int var:variables){
System.out.println(var);
}
}
}
- 输出结果
1
2
3
4
5
- 正规for循环修改数组元素
public class VariableTest {
public static void main(String[] args) {
// 定义数组
int[] variables = new int[]{1,2,3,4,5};
// 正规for循环遍历数组
for(int i=0;i<variables.length;i++){
if(variables[i]==3){
variables[i] = 0;
}
}
// 输出数组结果
for(int var:variables){
System.out.println(var);
}
}
- 输出结果
1
2
0
4
5
2. 集合/数组元素为对象
- 结论:当数组元素为对象时,forEach循环可以修改原数据。
- forEach循环修改集合元素
public class ObjectTest {
public static void main(String[] args) {
List<Emp> empList = Lists.newArrayList();
empList.add(new Emp("123","李华",12));
empList.add(new Emp("456","王五",18));
empList.add(new Emp("789","大师",16));
// forEach遍历集合
for(Emp emp:empList){
if(emp.getName().equals("大师")){
emp.setAddress("000");
}
}
// 输出数组结果
for(Emp emp:empList){
System.out.println(emp.getAddress()+","+emp.getName()+","+emp.getAge());
}
}
}
public class Emp {
private String address;
private String name;
private Integer age;
//getter and setter方法
}
- 输出结果
123,李华,12
456,王五,18
000,大师,16
三. 赋值测试
- 目的:为了了解上述问题的精髓,对变量和对象进行了赋值测试。
- 结论:对象和变量不一样。变量是独立的;对于对象,如果你把一个对象传给另一个对象,它们就是同一个对象,修改其中一个另一个就会修改!
1. 赋值测试·变量赋值
public class VariableAssignmentTest {
public static void main(String[] args) {
int a = 1;
int b = a;
b = 2;
System.out.println(a); // 1
}
}
- 说明:变量赋值后,修改变量b不会改变原变量a
2. 赋值测试·对象赋值
public class ObjectAssignmentTest {
public static void main(String[] args) {
Emp emp = new Emp("123","李华",12);
Emp temp = emp;
temp.setAge(100);
System.out.println(emp); // Emp{address='123', name='李华', age=100}
}
}
- 说明:对象赋值,赋的是引用(即原对象所在的地址)