簡體   English   中英

使用Java傳遞指向鏈表的指針。 但是,當我修改內存/陣列中的數據時,鏈表中的數據並未更新。 為什么?

[英]passing pointers to linked list using java. But when I modify the data in the memory/Array it's not updated in the Linked List. Why?

我是JAVA的新手。 我正在嘗試制作幾個鏈表。 所有持有指針/對某個數組元素的引用。 因此,如果我對數組進行任何更改,它都應反映在鏈接列表中。 對? 在我的程序中,修改顯示在數組中,但列表值相同。 (我刪除了一個元素。它不再在數組中。但是鏈接列表仍在顯示它)

我正在傳遞對鏈表的引用。 如果可行,為什么修改不起作用? 看起來鏈表有自己的數據副本。 但是,那不是參考的工作方式。

有什么解釋嗎? 建議還有什么可以用來顯示內存依賴性?

“(我刪除了一個元素。”您不能更改數組的大小。

根據您最可能看到的內容,如果刪除了一個元素,則創建了一個新數組,其中元素減少了一個。 這就是為什么LinkedList中的對象似乎未更改的原因。

first.add(WM.get(0))。

當您這樣做時,它與

Object referenceToObject = WM.get(0);
first.add(referenceToObject);

// removes the reference from WM.
WM.remove(0);
// this doesn't change referenceToObject or first
assert referenceToObject != null;
assert first.get(first.size() - 1) == referenceToObject;

但是你可以做到

// a reference to a reference.
AtomicReference<String> ref = new AtomicReference<>("Hello");

first.clear();
first.add(ref);

second.clear();
second.add(ref);

// all still there
assert first.get(0).get() == "Hello";
assert second.get(0).get() == "Hello";

// alter ref and all change
ref.set("World");
assert first.get(0).get() == "World";
assert second.get(0).get() == "World";

// or
ref.set(null);
assert first.get(0).get() == null;
assert second.get(0).get() == null;

LinkedList中沒有構造函數或方法來指定后備數組。 聽起來您有一個數組和一個LinkedList,並且正在向該數組添加一個對象,然后將該對象添加到LinkedList實例。 在這種情況下,從數組中刪除對象不會將其從LinkedList中刪除。 根據您的描述,您應該將對象添加到LinkedList實例,並將其用作事實的來源。

您的鏈接列表不包含對“數組元素”的引用,而是對數組引用的對象的引用。

// Create array
Person[] persons = new Person[2];
persons[0] = new Person("A");
persons[1] = new Person("B");

// Create linked list (of persons in reverse order)
LinkedList<Person> list = new LinkedList<>();
list.add(persons[1]);
list.add(persons[0]);

此時, persons (數組)和list都引用了兩個對象(人員A和人員B)。 如果將新的引用值分配給數組元素,則僅更新數組,而不更新列表。 但是,它們都引用相同的對象,因此,如果更改對象,它們都會“看到”它。

// Update array
persons[0] = new Person("C");

// Rename person B to B2
persons[1].setName("B2");

// Show content
System.out.println(persons[0] + ", " + persons[1]);
System.out.println(list);

假設Person已實現toString()以返回名稱,則這將是您的輸出:

C, B2
[B2, A]

我已在上面發表評論,但我認為您的回答值得一個答案。

我使用ArrayListWM = new ArrayList <>制作了數組。 然后我使用WM.add(string)手動輸入一些值。 首先創建2個列表,然后使用LinkedList創建第二個列表,然后將指針放置如下:first.add(WM.get(0)),second.add(WM.get(0))。 然后我刪除了WM [0]。 表明。 但第一和第二不受影響。

正如我在評論中提到的,Java是按值傳遞。 碰巧的是,當您傳遞對象時,會將引用的值傳遞給該對象。

當您執行first.add(WM.get(0)) ,將發生WM.get(0)得到評估並返回引用的情況。 然后,此引用first.add值傳遞給first.add因此現在我們對原始對象有兩個引用。 現在,當您“刪除” WM [0]處的值時,您實際上正在執行的操作是刪除對原始對象的一個​​引用。 其他參考保持不變。

我如何才能實現按引用致電? 這樣,每個人都會使用/編輯/更新相同的對象/數組元素?

對於使用和更新對象(通過在其上調用方法來改變其狀態),您所擁有的一切都很好。 如果通過更新意味着將一個對象的所有引用替換為對另一個對象的引用,那么這與Java的引用系統不符。 引用類似問題的答案; 即使可以,也不要這樣做。

最終,您要解決什么問題? 您已經說過您是Java的新手,這可能只是學習慣用的Java方法來解決問題的一種情況,而不是嘗試使用您熟悉的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM