簡體   English   中英

從另一個列表創建一個列表並從復制列表中刪除元素

[英]create a list from another list and remove elements from copied list

假設我有以下結構,我創建了一個這樣的列表。 如果我執行temp.remove(0)它將不會影響原始列表,但temp.get(0).vars.remove(0)也將從原始列表中刪除元素。

我認為new ArrayList(top.mids)沒有進行深層復制,那么temp.remove(0)如何影響原始列表呢?

//Top class init part and adding elements are omitted
List<Mid> temp = new ArrayList(top.mids);
temp.remove(0);
temp.get(0).bots.remove(0);


public class Top{
    List<Mid> mids = new ArrayList<Mid>();
}

public class Mid{
    List<Bot> bots = new ArrayList<Bot>();

}

public class Bot{
    int id; 
}

是的,你的理解是正確的。 List newList = new ArrayList(collection); 會做一份淺薄的副本。 您可以修改newList而不影響原始collection ,但它們每個都會引用相同的元素,因此如果您修改一個列表中的元素,另一個列表的元素也將獲得更改。

這稱為淺拷貝。 這是我所描述內容的直觀表示:

在此輸入圖像描述

底部的東西是數組中的對象。

該聲明

新的ArrayList(top.mids)沒有進行深層復制

指的是當你確實有一個包含舊列表的所有項目的新列表時,新列表中的項目引用內存中與舊列表相同的實例。

這意味着雖然您可以修改新列表的內容(即對對象的引用)而不會對舊列表產生任何影響,但是當通過舊列表訪問它們時,修改該列表中的對象也是可見的。

為了清楚起見,我想舉個例子:

List<X> oldList = Arrays.asList(new X("1"), new X("2"));
List<X> newList = new ArrayList<X>(oldList);

newList.remove(0);
System.out.println(newList.size()); // Prints 1
System.out.println(oldList.size()); // Prints 2

System.out.println(oldList.get(1).getValue()); // Prints 2
newList.get(0).setValue("3");
System.out.println(oldList.get(1).getValue()); // Prints 3

暫無
暫無

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

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