1

在 C++ 中,可以在 for-each 语句中使用引用变量,例如for (int &e : vec)where&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 + " ");
    }
}
4

3 回答 3

4

不,没有。无论如何,如果您在迭代它们时修改它们,大多数集合都会抛出 ConcurrentModificationException。

但是,没有什么可以禁止您修改集合中包含的对象:

for (Customer c : customers) {
    c.setActive(false);
}

对于列表,您可以在迭代时使用 ListIterator 替换当前元素。请参阅http://docs.oracle.com/javase/6/docs/api/java/util/ListIterator.html

于 2012-09-29T13:38:15.360 回答
2

在 Java 中,对象是通过引用传递的,而所有其他类型都是通过值传递的。

换句话说,没有办法e在你的循环中修改,因为它是一个int(即你正在写入一个值副本)

但是,如果您要遍历对象集合,则没有什么可以阻止您修改它们,只要它们公开了修改它们所需的方法。您仍然仅限于更改它们的值,而不是它们的引用(即您可以修改对象本身,但不能将其更改为另一个对象)

于 2012-09-29T13:42:13.053 回答
1

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");
}
于 2012-09-29T13:42:02.950 回答