java-链表,创建无名节点

java-链表,创建无名节点,java,nodes,Java,Nodes,我的问题可能太简单了:也许这就是我没有找到书面答案的原因。 我试图理解链表的构建方式,但有一件事我无法理解: 通常,当我创建某类对象时,我需要给它一个名称,如下所示: cat kitten =new cat(); 同时,当我这样做的时候,计算机会给它一个地址,比如dfe@fggv3444. 当我想在某种方法中使用创建的对象时,我用我给它起的名字来称呼它:在我们的例子中是:“cat”。 逻辑是,如果我用同一个名字“cat”命名两个对象,计算机将不知道要访问哪个对象——或者两者都不知道。 现在的

我的问题可能太简单了:也许这就是我没有找到书面答案的原因。 我试图理解链表的构建方式,但有一件事我无法理解: 通常,当我创建某类对象时,我需要给它一个名称,如下所示:

 cat kitten =new cat();
同时,当我这样做的时候,计算机会给它一个地址,比如dfe@fggv3444. 当我想在某种方法中使用创建的对象时,我用我给它起的名字来称呼它:在我们的例子中是:“cat”。 逻辑是,如果我用同一个名字“cat”命名两个对象,计算机将不知道要访问哪个对象——或者两者都不知道。 现在的问题是: 当我们使用链表时,在整个程序中使用的节点数量会发生很大变化。那么这个节点类类型的对象是如何获得它们的名称的呢?显然,它们必须有一个名称,但我不在那里给每个节点命名

它是怎么工作的

提前谢谢。
我确信这个问题中的某些东西一定很愚蠢,但我不知道是什么。

当您实例化这个对象ie时,Java为链表
Java.util.LinkedList
内置了一个类

LinkedList=新建LinkedList()

您正在创建对对象(链接列表)的引用,或者在您的案例名称中为“列表”

整个列表有一个名称“list”,可以作为遍历的起点。链表中的每个节点都没有“名称”。在java中,您可以遍历列表,类似于遍历数组的方式;通过索引

list.get(someIndex)

这个方法基本上遍历列表直到someIndex,然后返回那里的节点。您可以通过以下操作手动设置该节点的名称:

Node=list.get(someIndex)

但一般来说,它们没有“名称”,相反,您可以通过它们的索引或许多其他方法访问它们


查看有关内置类的更多详细信息,每个
cat
名称本质上(正如@Turing85在注释中指出的)只是以人类可读格式指向cat实例的内存地址

链表的核心是一组节点,每个节点都有一个
next
节点(
next
是连接节点以形成列表的变量)。每个cat将被简单地称为
节点。value
,其中
value
是指向节点cat地址的“名称”。每个节点的
next
变量指向下一个节点,该节点有自己的

      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
| ............ |
您不能在同一范围内为同一事物命名两个对象-您可以使用
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
| ............ |

在链表中,每个元素都由节点表示。这些节点通过它们在内存中的地址保持其他元素。这可能是一个伪名称,但实际上它只是表示它在内存中的位置的一种方式

可能令人困惑的是,您没有像在本代码中那样直接定义对象

Animal cow = new Animal();
在本例中,我们在变量
cow
中分配了新对象数据的地址。这使我们能够轻松访问它


与此相反,链表节点对象保存下一个节点的地址,但与任何其他对象一样,它们是作为该节点的属性包含的。

在Java中,在相同的可见性范围内,不能为任何两个变量赋予相同的名称(虽然这两个变量仍然存在,并且没有被Java垃圾收集器丢弃。更多信息:),否则编译器将不知道您引用的是哪个值或对象

要回答问题的第二部分,只要对象具有引用(访问对象的方式),它就存在。您的理解是对的,显然,必须访问添加到链接列表中的对象。假设第一个节点名为head,您必须在链接列表中找到对第三个节点的引用。head.next.next将引用链接列表中的第三个节点,它不必具有类似“head”的名称,但w只要有引用,我就不存在


希望这能回答您的问题!

变量名仅用于可读性。Java编译器将源代码转换为“机器可读”代码,其中不包含变量名。值以特定地址存储在内存中,例如以十六进制表示的
0x00000000

每个节点都包含一个值和下一个节点的内存地址。当您调用
cat.next();
时,您的计算机将获得下一个节点的地址而不是变量名,并且它知道该地址在哪里

注:

  • 值也可以存储在寄存器、缓存或磁盘中。它们还引用数据的地址
  • Java LinkedList实际上是双链接的,每个节点都包含其上一个节点的地址

  • 你所谓的“名字”只是一个人类可读的内存地址形式。如果你有一个链表,你通常会通过一个头部节点(即列表的开头)抓住该列表。从那里开始,你使用每个节点的下一个引用从一个节点跳到另一个节点。你不能--重复不能--给同一范围内的两个对象赋予相同的名称。如果其中一个在main方法和方法中的另一个方法,那么是的,您可以这样做,但不能在同一范围内。列表(arraylist或linkedlist)需要通过其元素进行迭代,您不需要每个位置的代码引用。提示:在LinkedLi之前查找数组和循环