java是值传递还是引用传递,我们以一个经典例子来讲讲@TOC
先请大家来看看add这个方法有什么问题吗
private class Node {
public E e;
public Node left;
public Node right;
public Node(E e){
this.e = e;
left = null;
right = null;
}
}
private void add(Node node, E e){
if(node == null){
size ++;
node = new Node(e);
return;
}
if(e.compareTo(node.e) < 0)
add(node.left, e);
else if(e.compareTo(node.e) > 0)
add(node.right, e);
}
首先这个add方法是一个二分搜索树的添加元素e。我们先从这个方法的参数开始讲起,当我们传入节点Node的一个对象,其实是我们将参数的node这个形参指向Node这个对象的堆地址值,但node = new Node(e);
这个操作后node这个参数指向了新创建的一个对象,最后结束方法。看到这里,我们再仔细想想,这个node参数指向的这个新对象最后没有指针指向它,会被gc掉。所以,我们这个向二分搜索树中添加元素进而也失败了。
下面我们来看看这个正确的添加方法。
public Node add(Node node, E e){
if(node == null){
size++;
node = new Node(e);
return node;
}
if(node.e.compareTo(e) < 0){
node.right = add(node.right, e);
} else if(node.e.compareTo(e) > 0){
node.left = add(node.left, e);
}
return node;
}
最后我们总结一下,我们面试中经常问到的java方法参数到底是值传递还是引用传递,我们可以这样解释。