直接使用set方法或循环遍历arrayList以设置数据

时间:2015-11-22 15:37:44

标签: java

有人可以解释为什么在清除cache.clear();之后删除nextNode的childern节点,如果我通过调用设置缓存conetent arrayList:

 child1.setNext(cache);

如果我使用for循环child1.next.add(cacheNode);

添加它们,它们就不会被删除
                    for (TrieNode cacheNode : cache) {
                        child1.next.add(cacheNode);

                    }

下面的工作有效,但我只想了解为什么我不能使用child1.setNext(cache);

代码:

                    ArrayList<TrieNode> cache = new ArrayList<TrieNode>();
                    if (nextNode.getNext() != null
                            && !nextNode.getNext().isEmpty()) {
                        for (TrieNode nextNodeChildern : nextNode.getNext()) {
                            cache.add(nextNodeChildern);

                        }
                        nextNode.setEdge(communsubString);
                        nextNode.getNext().clear();

                        TrieNode child1 = new TrieNode(substringSplit1);
                        //child1.setNext(cache);
                        for (TrieNode cacheNode : cache) {
                            child1.next.add(cacheNode);

                        }
                        nextNode.next.add(child1);
                        cache.clear();

                        TrieNode child2 = new TrieNode(substringSplit2);
                        child2.setWord(true);
                        nextNode.next.add(child2);

                    }

TrieNode类:

class TrieNode {

ArrayList<TrieNode> next = new ArrayList<TrieNode>();
String edge;
boolean isWord;

// To create normal node.
TrieNode(String edge) {
    this.edge = edge;

}

// To create the root node.
TrieNode() {
    this.edge = "";

}

public ArrayList<TrieNode> getNext() {
    return next;
}

public void setNext(ArrayList<TrieNode> next) {
    this.next = next;
}

public String getEdge() {
    return edge;
}

public void setEdge(String edge) {
    this.edge = edge;
}

public boolean isWord() {
    return isWord;
}

public void setWord(boolean isWord) {
    this.isWord = isWord;
}

}

1 个答案:

答案 0 :(得分:0)

当您将cache传递给setNext时,您传递了对cache列表的引用,即您节点中的列表和主代码中的列表指向内存中的相同列表。当您致电clear时,您将清空该节点正在使用的列表。

您需要通过在节点类之外或之内获取副本来为节点使用列表的副本,因此类似这样的内容将起作用:

public void setNext(ArrayList<TrieNode> next) {
    this.next = new ArrayList<>(next);
}

这将在节点内创建一个新的ArrayList,并将next中的所有元素复制到其中。