以下是来自热门YouTube video的简单链接列表。
public class Link {
public String bookName;
public int millionsSold;
public Link next;
public Link(String bookName, int millionsSold) {
this.bookName = bookName;
this.millionsSold = millionsSold;
}
@Override
public String toString() {
return bookName;
}
public static void main(String[] args) {
LinkList theLinkedList = new LinkList();
theLinkedList.insertFirstLink("Don Quixote", 500);
theLinkedList.insertFirstLink("A Tale of Two Cities", 200);
theLinkedList.insertFirstLink("The Lord of the Rings", 150);
theLinkedList.insertFirstLink("Harry Potter and the Sorcerer's Stone", 107);
theLinkedList.removeLink("A Tale of Two Cities");
System.out.println("\nA Tale of Two Cities Removed\n");
}
}
class LinkList {
public Link firstLink;
LinkList() {
firstLink = null;
}
public void insertFirstLink(String bookName, int millionsSold) {
Link newLink = new Link(bookName, millionsSold);
newLink.next = firstLink;
firstLink = newLink;
}
public Link removeLink(String bookName) {
Link currentLink = firstLink;
Link previousLink = firstLink;
while (currentLink.bookName != bookName) {
if (currentLink.next == null)
return null;
else {
previousLink = currentLink;
currentLink = currentLink.next;
}
}
if (currentLink == firstLink)
firstLink = firstLink.next;
else {
previousLink.next = currentLink.next;
}
return currentLink;
}
}
我无法理解removeLink
类的LinkedList
方法。在该方法中执行语句previousLink.next = currentLink.next
后,为什么更改也会反映在firstLink
变量中?
正如在评论和回答中所指出的,我理解对象变量是引用变量,并且多个变量可以引用相同的Object。因此,对任何一个引用变量的值的更改也会影响到同一引用的其他变量。
在上面的示例中,执行previousLink.next = currentLink.next
行后,currentLink
也会从firstLink
中删除,因为previousLink
和firstLink
都指向同一个对象。同样,执行currentLink = currentLink.next
时,为什么它对firstLink
没有任何影响?
答案 0 :(得分:3)
原因是变量只不过是对内存中位置的命名引用。
我们假设firstLink
指向内存中的某个Link
对象
然后,当你说
Link currentLink = firstLink;
Link previousLink = firstLink;
您将currentLink
和previousLink
指向内存中的同一个对象。现在,您对同一个对象有3个不同名称的引用。
这意味着,在此赋值之后,除非任何变量指向内存中的另一个位置,否则对其中任何变量的更改将反映在其他两个位置。
答案 1 :(得分:0)
执行语句previousLink.next = currentLink.next后 那个方法,为什么这些变化也反映在firstLink变量中?
这已经得到了很好的回答,但是为了完整性:因为在previousLink
本地指向的对象上设置一个值会改变堆上该对象的状态,并且指向它的任何其他局部变量都会看到那些变化。
用现实世界的术语来说:假设你认识琼斯先生是鲍勃,我认识他是罗伯特。如果你反对鲍勃所说的话并将他打在脸上,我会看到罗伯特有一只黑眼圈。
当currentLink = currentLink.next被执行时,为什么它没有 对firstLink有什么影响吗?
因为在这里我们只是简单地为一个局部变量赋值。我们已将currentLink
设置为指向链中的下一个节点 - 这是纯粹的本地更改。只有在我们采取一些影响currentLink
状态的行动时才会发挥作用(此时,我们正在改变堆上对象的状态)