设置值链接列表节点Java

时间:2017-08-24 12:48:18

标签: java linked-list

我正在研究如何从未排序的链接列表中删除重复项,并且对Java中的引用感到困惑:

public static void deleteDups (LinkedListNode n){
  Hashtable table = new Hashtable();
  LinkedListNode previous = null;
  while(n!=null){
      if(table.containsKey(n.data)){
          previous.next = n.next;
      } else {
          table.put(n.data, true);
          previous = n;
      }
      n = n.next;
  }
}

当我们执行n = n.next时,为什么previous的价值也不会被修改,因为previous指向n

1 个答案:

答案 0 :(得分:1)

变量n实际上并不包含LinkedListNode的实例。

变量n包含一个数字。例如,它可能包含数字0x04AF34ED

此号码是地址。如果处理器在计算机的RAM中查找该地址,它将找到与LinkedListNode相关联的数据。

变量previous也包含一个数字。在源代码的第10行,它碰巧与变量n保持相同的数字,这意味着它们指向同一个对象。在源代码的第11行,变量n被赋予一个新数字 - 对象n.next的地址。分配给previous的号码不会更改。它仍然保留旧LinkedListNode的地址。

在Java中,每次创建新对象时,如List list = new ArrayList(),您实际上都是在创建对该对象的引用:

  • 您要求操作系统提供空间来存储对象。
  • 操作系统为对象找到一个位置,并为您提供一个数字 - 内存的地址。
  • 该号码已分配给变量。
  • 您可以通过读取对象的字段来访问存储在变量地址中的数据。