我有一个关于这个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次,还是创建该组的副本并引用该副本?我试图理解这种行为.谢谢您的帮助!
是的,这是非常安全的.
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)