Java函数参数不变

Java函数参数不变,java,algorithm,Java,Algorithm,我有一些密码。在main函数中,我推送BST中的六个元素。当我查看调试器时,我看到变量size=5,但变量root=null。为什么变量根不改变 package Search; public class BST<Key extends Comparable<Key>, Val> { private class Node{ Key key; Val val; Node left; Node right; Node prev;

我有一些密码。在main函数中,我推送BST中的六个元素。当我查看调试器时,我看到变量size=5,但变量root=null。为什么变量根不改变

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);
}
包搜索;
公共类BST{
私有类节点{
钥匙;
Val-Val;
左淋巴结;
节点权;
节点前置;
节点(键k,值v){
key=k;
val=v;
}
}
公共无效推送(k键,v值){
推力(根,k,v);
}
专用无效推送(节点x,密钥k,Val v){
如果(x==null){
x=新节点(k,v);
大小++;
返回;
}
int cmp=x.key.compareTo(k);
如果(cmp>0)
推动(x、左、k、v);
否则如果(cmp<0)
推动(x、k、v);
其他的
x、 val=v;
}
节点根=空;
int size=0;
公共静态void main(字符串参数[]){
BST BST=新的BST();
bst.push(“c”,1);
bst.push(“b”,2);
bst.push(“d”,3);
bst.push(“a”,4);
bst.push(“e”,5);
bst.push(“c”,6);
}

}

如果
块中,分配:

x = new Node(k,v);
不会使您的
引用点指向新的
节点
对象。它只是分配给
new Node()
的方法的本地
x
引用。它不会影响
根目录
,它将仅为
null
。这是因为Java按值传递引用。一旦通过将
x
的参考值指定给新对象来更改它,它将不再与
root
相同

只需从第二个
push()
方法中删除
if
块。您应该只在第一个
push()
方法中执行该任务,在将其传递给第二个
push()
方法之前初始化
root
本身:

public void push(Key k, Val v){
    if (root == null) {
        root = new Node(k, v);
        size++;
        return;
    }
    push(root,k,v);
}

if
块中,分配:

x = new Node(k,v);
不会使您的
引用点指向新的
节点
对象。它只是分配给
new Node()
的方法的本地
x
引用。它不会影响
根目录
,它将仅为
null
。这是因为Java按值传递引用。一旦通过将
x
的参考值指定给新对象来更改它,它将不再与
root
相同

只需从第二个
push()
方法中删除
if
块。您应该只在第一个
push()
方法中执行该任务,在将其传递给第二个
push()
方法之前初始化
root
本身:

public void push(Key k, Val v){
    if (root == null) {
        root = new Node(k, v);
        size++;
        return;
    }
    push(root,k,v);
}

因为您正在按
push(键k,Val v)
中的值传递
root
。因此,对x的赋值不会赋值给字段
root

,因为您在
push(键k,值v)
中按值传递
root
。因此,对x的赋值不会将字段
分配给root