我的问题可能过于简单:也许这就是我无法找到书面答案的原因。 我试图理解链接列表的构建方式,有一件事我无法理解: 通常,当我创建某种类的对象时,我需要给它一个名字,如:
cat kitten =new cat();
在我这样做的同时,计算机给它一个地址,比如dfe @ fggv3444。 当我想在某种方法中使用创建的对象时,我通过我给它的名称来解决它:在我们的例子中:“cat”。 逻辑是,如果我用同名“cat”命名2个对象,计算机就不知道要访问哪个对象 - 或者两者都知道。 现在的问题是: 当我们使用链表时,使用的节点数在整个程序中会发生很大变化。那么节点类类型的这些对象如何得到它们的名字?显然他们必须有一个名字,但我不是在那里为每个节点命名......
它如何运作?!
提前谢谢。 我确信这个问题中的某些内容必须是愚蠢的,但无法弄清楚是什么。答案 0 :(得分:1)
每个cat
名称基本上(如注释中指出的@Turing85)只是一个人类可读格式的cat实例的内存地址。
链接列表的核心是一组节点,每个节点都有一个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
| ............ |
答案 1 :(得分:0)
Java有链接列表的内置类java.util.LinkedList
当你实例化这个对象时,即。
LinkedList<Node> list = new LinkedList<Node>();
您正在创建引用,或者在您的情况下名称&#34; list&#34;到对象(你的链表)
整个列表都有一个名称&#34; list&#34;这可以作为你的遍历的起点。没有&#34;名称&#34;对于链表中的每个节点。在java中,您可以遍历列表,类似于数组的方式;通过索引。
list.get(someIndex)
此方法基本遍历列表直到someIndex,并返回该节点。您可以通过执行手动设置该节点的名称;
Node node = list.get(someIndex)
但总的来说,他们没有&#34;名称&#34;而是可以通过他们的索引或许多其他方法访问它们。
检查https://docs.oracle.com/javase/7/docs/api/java/util/LinkedList.html以获取有关内置类
的更多详细信息答案 2 :(得分:0)
在链表中,每个元素都由节点表示。这些节点通过其在内存中的地址保持其他元素。这可能是伪名称,但实际上它只是一种表示它在内存中的位置的方式。
让您感到困惑的是,您不会像在此代码中那样直接定义对象。
Animal cow = new Animal();
在这个例子中,我们在变量cow
中分配了新对象数据的地址。这使我们可以轻松访问它。
与此相反,链表节点对象保存下一个节点的地址,但就像任何其他对象一样,它们只包含在该节点的属性中。
答案 3 :(得分:0)
在同一可见范围内,你不能给Java中的任何两个变量赋予相同的名称(虽然两个变量仍然存在,并且没有被Java垃圾收集器破坏。更多信息:http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html),否则编译器不知道你指的是哪个值或对象。
要回答问题的第二部分,只要对象具有引用(访问对象的方式),就会存在该对象。您理解显然,必须访问添加到链表中的对象是正确的。假设第一个节点名为head,您必须在链表中找到对第三个节点的引用。 head.next.next将是对链接列表中第三个节点的引用,它不一定必须具有类似&#39; head&#39;的名称,但只要它具有引用就会存在。
希望这能回答你的问题!
答案 4 :(得分:0)
变量名仅用于提高可读性。 Java编译器将源代码转换为“机器可读”代码,该代码不包含变量名。值以特定地址存储在内存中,例如十六进制的0x00000000
。
每个节点都包含一个值和下一个节点的内存地址。当您致电cat.next();
时,您的计算机将获取下一个节点的地址而不是变量名称,并且它知道该地址的位置。
注意: