簡體   English   中英

為什么變量會影響之前評估過的其他 arraylist?

[英]why a variable effects on other arraylist that's valuated before?

我有大量代碼,所以我無法復制所有代碼,對此我很抱歉。

但我得到了一些重要的部分。

我有一個 class 'Box' 可以獲得值 '0' 或 '1' 並且我有一個 'boxes' 是一個 arraylist 的 'Box'

一直在代碼中更新。 我還有另一個 class '狀態',它是'盒子'的 arraylist 和

其他一些東西,我想用它來回溯。

我們可以將“盒子”視為程序的 map,並在其中“狀態”保存“盒子”。

所以我有一個名為'states'的'state'的arraylist來保存所有'盒子'在代碼期間的每個步驟中制作,以便在必要時返回。

我有一個評估盒子的方法,我在一個while循環中調用它。

我不明白為什么當我創建“狀態”的新實例並向其添加當前的“框”時,“狀態”的值會隨着代碼中“框”的變化而變化!!!!

即使我從“while循環”中創建了自變量“state st2”來檢查發生了什么,我也看到“st2”也在發生變化。 並在代碼的第一次對其進行評估。

state st1 = new state();
st1.setBoxes(boxes); 

換句話說,我們在“狀態”中有一些“狀態”,它們都更改為最后一個 state 並且無法保存自己的值。

為了更好的概念

起初我添加了一個 state 我有

st1

在“狀態”中

下次我將另一個“狀態”(如“st2”)添加到“狀態”時

我有

st2 , st2

下次:

st3 , st3 , st3

我該如何解決?

我還創建了“Box”的新“ArrayList”並將“boxes”分配給它但不工作。

我還在每個步驟中創建了新的“狀態”,但這也不起作用。 任何機構可以幫助我解決它? 如果您對我的問題評論有任何歧義或錯過理解,我會回答。 如果你有更好的方法請告訴我。

謝謝

所有 object 變量都是引用。 它們是藏寶圖。 當你寫:

List<String> x = new ArrayList<String>();

然后new ArrayList<String>()創建新的寶藏並將其埋在沙子中。 List<String> x描述了您創建的寶藏 map,中間的=表示 x 現在是您剛剛埋葬的寶藏的 map。 x 是 map 的名字,不是 寶物無名。

setBoxes(x);

請記住,x 是通往寶藏的寶藏 map。 它本身並不是寶藏。 因此,這會復制您的寶藏 map 並將其交給setBoxes方法。 但是,它根本不會復制寶箱。 2張地圖,但它們通向同一個地方。 如果 setBoxes 是:

public void setBoxes(List<Box> boxes) {
    this.boxes = boxes;
}

然后你調用 setBoxes 的 object 有一個字段,而且,在 java 中,都是藏寶 那個領域現在也是一個 map 到.. 還是一樣的寶。 如果你制作更多這些對象,那么它們都有自己的寶藏副本map ,但所有地圖都指向同一個寶藏。 因此,如果其中一個這樣做:

boxes.add("Hello");

好吧,點 ( . ) 是取消引用運算符:“跟隨此 map 並向下挖掘”運算符。 因此,每個人都可以看到這個添加 - 畢竟每個人都有一個 map 到同一個寶藏。 如果其他人后來跟隨他們的副本,他們會到達同一個寶箱,因此他們會看到 Hello 已添加到其中。

解決方案是開始復制寶藏,而不僅僅是地圖:

List<Box> copy = new ArrayList<Box>();
copy.addAll(boxes);

現在你有兩個寶藏,每個都是一樣的。 boxes是其中之一的 map。 將 map copy到另一個。

暫無
暫無

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

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