考虑以下功能:
private static void printTrie(Node root){
Iterator it = root.children.entrySet().iterator();
while (it.hasNext()) {
Map.Entry pair = (Map.Entry)it.next();
System.out.println((Character)pair.getKey());
root = (Node)pair.getValue();
printTrie(root);
it.remove(); // avoids a ConcurrentModificationException
}
}
以下是Node
:
static class Node {
private HashMap<Character, Node> children;
private boolean isCompleteContact;
public Node(){
children = new HashMap<Character, Node>();
isCompleteContact = false;
}
}
我的问题是:在函数中,我根据Iterator
创建了一个名为it
的{{1}}。但是,在迭代root
公开的所有元素的过程中,我将it
重新分配给另一个节点。这会改变root
的行为吗?即,it
是否仍然引用原始it
或我们在while循环中途分配给root
的新值?
答案 0 :(得分:2)
它指的是原始对象root所指的。这是因为迭代器是从变量root的值派生而来的,而不是它本身作为对该值的引用。
答案 1 :(得分:1)
由于Java始终是按值传递,因此root
引用的重新分配不会重新分配根对象/实例,而只会重新分配root
引用。
语句root = (Node)pair.getValue();
仅将本地引用root
重新分配给新对象。您将继续迭代原始根对象,因为迭代器是在原始根对象上创建的,由于按值传递语义而无法重新分配。
另请注意,如果您在迭代时向children
HashMap
添加新值,则会产生ConcurrentModficationException
。您可以使用相同的迭代器安全地执行的唯一操作是通过调用remove
Iterator
来删除正在迭代的当前元素