[英]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.