在C++中,可以在for-each语句中使用引用变量,例如 for (int &e : vec)
其中&e
是对e
值的引用。这使人们能够更改在 for-each 循环中与之交互的元素的值。Java 中是否有等效的构造?
下面是如何在 C++ 中的 for-each 循环中使用引用变量的示例。
#include <iostream>
#include <vector>
int main()
{
// Declare a vector with 10 elements and initialize their value to 0
std::vector<int> vec (10, 0);
// e is a reference to the value of the current index of vec
for (int &e : vec)
e = 1;
// e is a copy of the value of the current index of vec
for (int e : vec)
std::cout << e << " ";
return 0;
}
如果在第一个循环中没有使用引用运算符 &
,则对 1 的赋值将只分配给一个变量e
该变量是 vec
当前元素的副本(而不是引用),即 &
不仅可以从向量读取,还可以在 for-each 循环中写入向量。
例如,以下 Java 代码不会修改原始数组,而只是修改副本:
public class test {
public static void main(String[] args) {
test Test = new test();
int[] arr = new int[10];
for (int e : arr) // Does not write to arr
e = 1;
for(int e : arr)
System.out.print(e + " ");
}
}
不,没有。无论如何,如果您在迭代它们时修改它们,大多数集合都会抛出 ConcurrentModificationException。
但是,没有任何内容禁止您修改集合中包含的对象:
for (Customer c : customers) {
c.setActive(false);
}
对于列表,可以使用列表迭代器在迭代时替换当前元素。请参阅 http://docs.oracle.com/javase/6/docs/api/java/util/ListIterator.html
在 Java 中,对象通过引用传递,所有其他类型通过值传递。
换句话说,没有办法修改循环中的e
,因为它是一个int
(即你正在写入一个值副本)
但是,如果您要循环访问对象集合,则只要它们公开修改它们所需的方法,就没有什么可以阻止您修改它们。 您仍然被限制更改它们的值,而不是它们的引用(即您可以修改对象本身,但不能将其更改为另一个对象)
在java中没有像C++那样的引用。
如果要修改列表对象,则必须以老式的方式处理向量:
for (int = 0; i < vector.size(); i++) {
Object oldObject = vector.get(i);
vector.set(i, newObject);
}
但是,如果要修改对象内容,foreach 可以解决问题:
for (SomeObject o : list) {
o.setName("foo");
}