Java函数参数不会改变

时间:2013-09-16 16:26:36

标签: java algorithm

我有一些代码。在主要功能中,我在BST中推六个元素。当我看调试器时,我看到变量size = 5,但变量root = null。为什么变量root不会改变。

package Search;

public class BST<Key extends Comparable<Key>, Val> {
private class Node{
    Key key;
    Val val;
    Node left;
    Node right;
    Node prev;
    Node(Key k, Val v){
        key = k;
        val = v;
    }
}
public void push(Key k, Val v){
    push(root,k,v);
}
private void push(Node x, Key k, Val v){
    if(x == null){
        x = new Node(k,v);
        size++;
        return;
    }
    int cmp = x.key.compareTo(k);
    if(cmp > 0)
        push(x.left,k,v);
    else if(cmp < 0)
        push(x.right,k,v);
    else
        x.val = v;

}
Node root = null;
int size = 0;
public static void main(String args[]){
    BST<String,Integer> bst = new BST<String, Integer>();
    bst.push("c",1);
    bst.push("b",2);
    bst.push("d",3);
    bst.push("a",4);
    bst.push("e",5);
    bst.push("c",6);
}

}

2 个答案:

答案 0 :(得分:5)

if区块中,分配:

x = new Node(k,v);

不会将root引用点指向新的Node对象。它只是分配给x的该方法的本地new Node()引用。它不会影响root,只会null。这是因为Java通过值传递引用。通过将参考值分配给新对象来更改x的参考值后,它将不再与root相同。

只需从第二个if方法中移除push()块即可。您应该只在第一个push()方法中执行该任务,在将root本身传递给第二个push()方法之前初始化public void push(Key k, Val v){ if (root == null) { root = new Node(k, v); size++; return; } push(root,k,v); }

{{1}}

答案 1 :(得分:0)

因为您在root中按值传递了push(Key k, Val v)。因此,对x的赋值不会指定字段root