Reference,Object,LinkedList

时间:2017-10-06 20:38:32

标签: java

所以我从头开始构建LinkedList。虽然代码有效,但我对两件事感到困惑。

当你写(public node root)时,你正在创建对象的引用?换句话说这是指针吗?如果是,则在方法add()中检查第一次迭代的根equalsnull是否正确,并且代码创建该类的实例。

我的问题来自方法Find()。如果root为null,并且我设置了temp1=root,那么temp1也不会null,因为rootnull?或者temp1指向rootroot指向null?这些有何不同?

编辑:如果temp1为null,那么为什么方法find()有效?

public class LinkedList {

    public Node root;

    public void add(int data) {
        if(root == null) {
            root = new Node(data);          
        }
        else {
            Node temp1 = root;
            Node temp = new Node(data);

            while(temp1.getNext() != null) {
                temp1 = temp1.getNext();
            }

            temp1.setNext(temp);                    
        }       
    }

    public boolean Find(int data) {
        Node temp1 = root;

        while(temp1 != null) {
            if(temp1.getData() == data) {
                return true;
            }
            temp1 = temp1.getNext();
        }

        return false;
    }
}

2 个答案:

答案 0 :(得分:0)

Java中的任何对象值变量实际上是对存储在堆上的实际对象的引用。

Find方法中,您将root的引用分配给temp1,您现在基本上有两个对同一Node对象的引用。

如果您在致电Find之前致电addroot(和temp1,因为他们引用相同的对象)是null所以此功能将永远返回false.

仅在致电add后,Node对象的引用将被分配给root,才有可能返回true

答案 1 :(得分:0)

  

当您编写(公共节点根目录)时,您正在创建对该对象的引用?

是。您正在声明Node类型的对象引用。由于您没有初始化它,因此参考值为null。 Java引用就像其他语言中的指针一样,尽管有一些关键的区别。像指针一样,对象引用的值将是包含对象的内存地址。与其他一些语言不同,您不能使用Java引用进行指针运算。

Java Language Specification可以说明这个问题:

  

参考值(通常只是引用)是指向这些的指针   对象,以及一个特殊的空引用,它不引用任何对象。

我最初做了一个更复杂的语法参数,但在回到JLS之后,我同意引用是指针,即使Java中不支持C风格的指针操作。

  

当root为null,并且我设置temp1 = root时,temp1也不会为null,因为root为null?

是的,temp将被赋予root的值。也就是说,它将引用root当前引用的同一个Node实例。如果在进行此调用时root为null,则temp1也将为null。

在你的代码中,可以(可能应该)在构造函数中初始化你的根节点。每次在其他方法中调用new LinkedList()时,这将初始化根节点。请注意,我做了一些其他的小改动,以使这个类更符合:

public class LinkedList {

    // made this private
    // be sure to add get/set methods to access/change this value 
    // if needed outside this class
    private Node root;

    // default (no-arg) constructor
    public LinkedList() {
      root = new Node();
    }

    public void add(int data) {
      Node temp1 = root;
      Node temp = new Node(data);

      while(temp1.getNext() != null) {
          temp1 = temp1.getNext();
      }

      temp1.setNext(temp);                    
    }

    public boolean find(int data) {
        Node temp1 = root;

        while(temp1 != null) {
            if(temp1.getData() == data) {
                return true;
            }
            temp1 = temp1.getNext();
        }

        return false;
    }
}