有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

foreach是否有一个Java等效的foreach循环和一个引用变量?

<>在C++中,每个语句可以使用引用变量,例如^ {CD1>},其中^ {CD2>}是对^ {CD3>}值的引用。这使我们能够在for-each循环中更改与之交互的元素的值。Java中是否有等效的构造

这是C++中每个循环中引用变量如何使用的一个例子。

#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当前元素的副本(而不是引用),即&使人不仅可以从向量中读取,还可以为每个循环写入向量

例如,以下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 + " ");
    }
}

共 (3) 个答案

  1. # 1 楼答案

    不,没有。不管怎样,如果你在迭代时修改它们,大多数集合都会抛出ConcurrentModificationException

    但是,没有任何内容禁止您修改集合中包含的对象:

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

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

  2. # 2 楼答案

    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");
    }
    
  3. # 3 楼答案

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

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

    但是,如果你在一组对象上循环,没有什么能阻止你修改它们,只要它们公开修改它们所需的方法。您仍然只能更改它们的值,而不是它们的引用(即您可以修改对象本身,但不能将其更改为另一个对象)