java - 设置值链表节点Java

标签 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

最佳答案

变量n实际上并不保存LinkedListNode的实例。

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

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

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

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

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

关于java - 设置值链表节点Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45862086/

相关文章:

c++ - 如何在不访问其父节点的情况下删除链表中的节点?

c - 链表问题

java - 创建通用数据类型的链表,但所有节点在 Java 中应具有相同的数据类型

Java异常和错误处理

Java Atmosphere Jersey 从 Broadcastable 返回 JSON 对象

java - 构建 spark 时出现内存问题

c - 如何编写一个创建空队列的c函数?

c++ - 排序链接列表 - 移动节点或交换数据成员?

Java - Html 特殊字符

java - Hibernate 在公式注释中使用对象的属性字段