一. 先說結論
- 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}
}
}
- 說明:對象賦值,賦的是引用(即原對象所在的地址)