我正在研究如何从未排序的链接列表中删除重复项,并且对 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/