[英]java- linked lists, creating nameless nodes
我的问题也许太简单了:也许这就是我没有找到书面答案的原因。 我试图了解链接列表的构建方式,但有一件我无法理解的事情:通常,当我创建某种类的对象时,需要给它起一个名字,例如:
cat kitten =new cat();
在执行此操作的同时,计算机会为其提供一个地址,例如dfe @ fggv3444。 当我想以某种方法使用创建的对象时,我用我给它的名称来解决它:在我们的例子中是“ cat”。 逻辑是,如果我用相同的名称“ cat”命名2个对象,则计算机将不知道要访问哪个对象,或者可能都不知道。 现在的问题是:当我们使用链表时,整个程序中使用的节点数变化很大。 那么节点类类型的对象如何获得其名称? 显然他们必须有一个名字,但是我不在那里给每个节点起名字...
这个怎么运作?!
提前致谢。 我确定这个问题中的某些内容一定很愚蠢,但无法弄清楚是什么。
每个cat
名称本质上(如注释中的@ Turing85所指出的)只是人类可读格式的猫实例的内存地址。
链表的核心是一组节点,每个节点都有一个value
和next
节点( next
是将节点连接起来以形成列表的变量)。 每只猫将简称为node.value
,其中value
是指向节点猫的地址的“名称”。 每个节点的next
变量指向具有自己的value
的下一个节点。
您不能在同一范围内为相同的对象命名-您可以使cat1
和cat2
都属于cat
类型,并且每个都指向不同cat
的内存地址。 链表之所以能够做到这一点,是因为每个节点都有自己的作用域,而其他节点看不到。 因此,所有节点都可以有一个next
和一个value
,称为node.next
和node.value
。
node1 +--------> node2 +--------> node3
+--------------+ | +--------------+ | +--------------+
| value = cat1*| | | value = cat2 | | | value = cat3 |
| next = node2-|---+ | next = node3-|---+ | next = null |
+--------------+ +--------------+ +--------------+
*---> cat1
+--------------+
| name = "tom" |
| col = "grey" | ...and likewise for the other nodes
| ............ |
Java实例化此对象时,Java有一个用于链接列表的内置类java.util.LinkedList
。
LinkedList<Node> list = new LinkedList<Node>();
您正在创建引用 ,或者在您的情况下, 名称为对象(您的链接列表)的“列表”
整个列表都有一个名称“列表”,可以作为遍历的起点。 链表中的每个节点都没有“名称”。 在Java中,您可以遍历列表,有点类似于数组。 通过索引。
list.get(someIndex)
此方法基本上遍历列表,直到someIndex,然后返回那里的节点。 您可以通过手动为该节点设置名称。
Node node = list.get(someIndex)
但是通常,它们没有“名称”,而是可以通过它们的索引或许多其他方法来访问它们。
检查https://docs.oracle.com/javase/7/docs/api/java/util/LinkedList.html,以获取有关内置类的更多详细信息
在链表中,每个元素都由节点表示。 这些节点通过它们在内存中的地址保留其他元素。 这可能是伪名称,但实际上,这只是表示其在内存中的位置的一种方式。
可能使您感到困惑的是,您没有像在此代码中那样直接定义对象。
Animal cow = new Animal();
在这种情况下,我们在变量cow
分配了新对象数据的地址。 这使我们可以轻松访问它。
与此相反,链表节点对象保留下一个节点的地址,但与其他任何对象一样,它们只是该节点的属性而被包含。
您不能在相同的可见性范围内为Java中的任何两个变量赋予相同的名称(而这两个变量仍然存在,并且不会被Java垃圾收集器丢弃。)更多信息: http : //www.oracle.com/webfolder/ technetwork / tutorials / obe / java / gc01 / index.html ),否则编译器将不知道您所指的是哪个值或对象。
要回答问题的第二部分,只要对象具有引用 (访问该对象的方式)就存在。 您应该理解,很显然,必须访问添加到链接列表的对象。 假设第一个节点名为head,并且您必须在链接列表中找到对第三个节点的引用。 head.next.next将是对链表中第三个节点的引用,它不一定必须具有“ head”之类的名称,但只要有引用就将存在。
希望这能回答您的问题!
变量名仅出于可读性。 Java编译器将源代码转换为“机器可读”代码,其中不包含变量名。 值存储在具有特定地址的内存中,例如十六进制的0x00000000
。
每个节点包含一个值和下一个节点的内存地址。 调用cat.next();
,您的计算机将获取下一个节点的地址而不是变量名,并且它知道该地址在哪里。
注意:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.