Java foreach是否会创建副本?

tou*_*ody 0 java foreach jvm

我有一个关于这个foreach的问题:

    for(Element e : nullProof(setOfElements)){
            // do stuff
    }
Run Code Online (Sandbox Code Playgroud)

让我们假设我定义了函数nullProof来返回一个非null的Set(因为我听说你不应该将null传递给一个增强的for循环.这是真的吗?):

    private Set<Element> nullProof(Set<Element> s){
          return s == null ? Collections.<Element> emptySet() : s;
    }
Run Code Online (Sandbox Code Playgroud)

我的问题是...... 在foreach中调用nullProof函数是否安全?具体来说,以下标题相当于:

    for(Element e : setOfElements){    //assuming setOfElements != null
Run Code Online (Sandbox Code Playgroud)

我想知道是否有人可以指出一些Java标准,它说这是定义的行为.

此外,有人可以解释这个foreach被称为"幕后"实际发生的事情吗?

假设setOfElements的大小为6.对于通过setOfElements的每次迭代,JVM是否会查找setOfElements 6次,还是创建该组的副本并引用该副本?我试图理解这种行为.谢谢您的帮助!

Jea*_*art 6

是的,这是非常安全的.

for(Element e :  nullProof(setOfElements)) {
Run Code Online (Sandbox Code Playgroud)

相当于

Set<Element> s = nullProof(setOfElements);
for(Element e :  s) {
Run Code Online (Sandbox Code Playgroud)

正如JLS-14中所述,在场景后面,每个循环相当于:

for(Iterator<Element> it = s.iterator() ; it.hasNext() ; ) {
    Element e = it.next();
    // ...
}
Run Code Online (Sandbox Code Playgroud)