是否有一个 Java 等效的带有引用变量的 for-each 循环



在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");
}