Java:返回实际对象与返回引用

标签 java data-structures

按值传递和按引用传递 - 我在 C++ 中一直这样做。但我想知道 java 的行为。

我正在编写 BST 并想出以下方法:

private Node<T> get_node(T data)
{
    Node<T> tmp = null;
    if (isEmpty())
    {
        return null;
    }
    tmp = root;
    while (tmp != null)
    {
        //System.out.println("tmp is " + tmp.getData());
        if (compare(tmp.getData(), data) < 0) //data is greater
        {
            System.out.println("get right");
            tmp = tmp.getRight();
        }
        else if (compare(tmp.getData(), data) < 0) //tmp is greater
        {
            System.out.println("get left");
            tmp = tmp.getLeft();
        }
        else if (compare(tmp.getData(), data) == 0) //we found it
        {
            System.out.println("get left");
            return tmp;
        }
    }
    return null;
} 

这是在 BST 类本身中 - 我正在使用这个辅助函数在“this”中构造一个新的 BST。

问题是,我不认为这个方法实际上返回了 this 中的实际节点。我认为它正在返回一份副本或对我同样无用的东西。我真的希望它返回其中的实际节点。

这是如何完成的?这到底完成了吗?

最佳答案

Java 不按引用传递,它始终按值传递。

对于对象,对象引用也作为副本传递,因此如果您有引用的副本,您将能够操作值,但不要将其与按引用传递混淆。

public void swap(Point a, Point b)
{
  Point temp = a;
  a = b;
  b = temp;
}
Point x;
Point y;

swap(x, y);

执行交换后 x 和 y 仍然具有相同的引用。

但是下面的代码会改变该值

public void change(Point a)
    {
      a.x=10; //reference is copied but same, so value will change 
    }
Point x;
change(x);

关于Java:返回实际对象与返回引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18992522/

相关文章:

java - 从 XML 扩充可绘制对象

java - 发送嵌入 SOAP 消息中的 XML 数据的最佳实践是什么?

java - Spring Boot中的初始化和调度

java - 如何从 java 程序中传递命令行参数?

c++ - 仅覆盖自定义数据结构的迭代器的 operator*()

java - 单例模式 : Using Enum Version

data-structures - 为什么我们不在红黑树插入中添加黑色节点而不是红色节点?

algorithm - 设计一个支持getMedian函数的Queue

c++ - C++11 中不可变的 "functional"数据结构

sql - 用户事件的数据库结构是否正确?