使用交换函数在Java中交换两个引用时出现意外的结果

时间:2013-11-23 20:06:21

标签: java

我有两个引用,引用一个指向对象a,引用b指向对象b,然后我调用一个交换函数来尝试让一个指向对象b,b指向对象a,它在交换中交换功能,但主要功能的结果没有改变。那我该怎么办?

交换功能:

private void swap(Stack<TreeNode> a, Stack<TreeNode> b) {
    Stack<TreeNode> temp = new Stack<TreeNode>();
    temp = a;
    a = b;
    b = temp;
}

2 个答案:

答案 0 :(得分:5)

交换的结果是方法的本地,一旦方法返回其调用点就不会有任何影响 - 你只是交换局部变量。调用该方法时,会传递对象引用的副本,而不是实际的对象本身。

Java具有按值传递的语义,在对象作为参数传递给方法的情况下,这意味着传递了引用的副本。请查看此post作为示例。

另请注意,对象在调用方法之前引用现有的,并且作为参数的方法中的 in 内部的引用实际上指向同一个对象,因此对方法返回后,您在方法中执行的对象内容将保留在原位。

答案 1 :(得分:2)

您正在更改本地参数,而不是这些参考的实际内容。一种解决方案是修改您发送的实例。 E.g。

private boolean swap(Stack<TreeNode> a, Stack<TreeNode> b)
{
    if(a == null || b == null) return false;
    Stack<TreeNode> temp = new Stack<>();
    while(!a.empty()) temp.add(a.pop());
    while(!b.empty()) a.add(0, b.pop());
    while(!temp.empty()) b.add(temp.pop()); 
    return true;   
}