java - Java foreach 是否创建副本?

标签 java foreach jvm

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

    for(Element e : nullProof(setOfElements)){
            // do stuff
    }

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

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

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

    for(Element e : setOfElements){    //assuming setOfElements != null

我想知道是否有人可以向我指出一些 Java 标准,该标准表明这是定义的行为。

此外,有人可以解释调用此 foreach 时“幕后”实际发生的情况吗?

假设 setOfElements 的大小为 6。对于 setOfElements 的每次迭代,JVM 会查找 setOfElements 6 次不同的时间吗?创建该集的副本并引用该副本?我正在尝试理解这种行为。感谢您的帮助!

最佳答案

是的,它非常安全。

for(Element e :  nullProof(setOfElements)) {

相当于

Set<Element> s = nullProof(setOfElements);
for(Element e :  s) {

JLS-14 中所述,在幕后 foreach 循环相当于:

for(Iterator<Element> it = s.iterator() ; it.hasNext() ; ) {
    Element e = it.next();
    // ...
}

关于java - Java foreach 是否创建副本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28351773/

相关文章:

java - 仅在 for 循环中打印所有其他枚举值

java - 调试java代码时出现警告

java generics 返回类型的方法应该是相同的传递参数传递

java - 是否可以在运行时提供新的 PropertiesConfiguration 文件?

java - 拆分字符串两次

Foreach 中的 C# 操作

php mysql 使复选框被选中

java - == 运算符在 Java 中是如何实现的?

java - 我应该如何诊断和防止 JVM 崩溃?

java - 正则表达式在正则表达式匹配之前提取字符串的一部分