我正在研究如何从未排序的链接列表中删除重复项,并且对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
?
答案 0 :(得分:1)
变量n
实际上并不包含LinkedListNode
的实例。
变量n
包含一个数字。例如,它可能包含数字0x04AF34ED
。
此号码是地址。如果处理器在计算机的RAM中查找该地址,它将找到与LinkedListNode
相关联的数据。
变量previous
也包含一个数字。在源代码的第10行,它碰巧与变量n
保持相同的数字,这意味着它们指向同一个对象。在源代码的第11行,变量n
被赋予一个新数字 - 对象n.next
的地址。分配给previous
的号码不会更改。它仍然保留旧LinkedListNode
的地址。
在Java中,每次创建新对象时,如List list = new ArrayList()
,您实际上都是在创建对该对象的引用: