更改创建迭代器的对象

时间:2017-01-23 17:32:02

标签: java iterator

考虑以下功能:

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的新值?

2 个答案:

答案 0 :(得分:2)

它指的是原始对象root所指的。这是因为迭代器是从变量root的值派生而来的,而不是它本身作为对该值的引用。

答案 1 :(得分:1)

由于Java始终是按值传递,因此root引用的重新分配不会重新分配根对象/实例,而只会重新分配root引用。

语句root = (Node)pair.getValue();仅将本地引用root重新分配给新对象。您将继续迭代原始根对象,因为迭代器是在原始根对象上创建的,由于按值传递语义而无法重新分配。

另请注意,如果您在迭代时向children HashMap添加新值,则会产生ConcurrentModficationException。您可以使用相同的迭代器安全地执行的唯一操作是通过调用remove

上的Iterator来删除正在迭代的当前元素