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 + " ");
}
}
# 1 楼答案
不,没有。不管怎样,如果你在迭代时修改它们,大多数集合都会抛出ConcurrentModificationException
但是,没有任何内容禁止您修改集合中包含的对象:
对于列表,可以在迭代时使用ListIterator替换当前元素。见http://docs.oracle.com/javase/6/docs/api/java/util/ListIterator.html
# 2 楼答案
如果要修改列表对象,必须以老式方式处理向量:
但是,如果您想修改对象内容,foreach可以做到:
# 3 楼答案
在Java中,对象是通过引用传递的,所有其他类型都是通过值传递的
换句话说,没有办法修改循环中的
e
,因为它是一个int
(即您正在向值副本写入)但是,如果你在一组对象上循环,没有什么能阻止你修改它们,只要它们公开修改它们所需的方法。您仍然只能更改它们的值,而不是它们的引用(即您可以修改对象本身,但不能将其更改为另一个对象)