簡體   English   中英

如何在Java中克隆通用List?

[英]How do I clone a generic List in Java?

我有一個ArrayList<String> ,我想返回一份副本。 ArrayList有一個克隆方法,它具有以下簽名:

public Object clone()

在我調用此方法之后,如何將返回的Object轉換回ArrayList<String>

你為什么要克隆? 創建新列表通常更有意義。

List<String> strs;
...
List<String> newStrs = new ArrayList<>(strs);

任務完成。

ArrayList newArrayList = (ArrayList) oldArrayList.clone();

這是我用於此的代碼:

ArrayList copy = new ArrayList (original.size());
Collections.copy(copy, original);

希望對你有用

使用Java 8,可以使用流克隆它。

import static java.util.stream.Collectors.toList;

...

List<AnObject> clone = myList.stream().collect(toList());

請注意,Object.clone()存在一些主要問題,在大多數情況下不鼓勵使用它。 請參閱Joshua Bloch的“ Effective Java ”中的第11項,以獲得完整的答案。 我相信你可以安全地在原始類型數組上使用Object.clone(),但除此之外,你需要明智地正確使用和重寫克隆。 您可能最好定義一個復制構造函數或靜態工廠方法,根據您的語義顯式克隆對象。

我認為這應該使用Collections API來解決這個問題:

注意 :復制方法以線性時間運行。

//assume oldList exists and has data in it.
List<String> newList = new ArrayList<String>();
Collections.copy(newList, oldList);

我發現使用addAll工作正常。

ArrayList<String> copy = new ArrayList<String>();
copy.addAll(original);

使用括號而不是泛型語法

如果你想要這個以便能夠在getter中返回List,那么最好這樣做:

ImmutableList.copyOf(list);

要克隆像java.util.List這樣的通用接口,您只需要轉換它。 在這里你是一個例子:

List list = new ArrayList();
List list2 = ((List) ( (ArrayList) list).clone());

這有點棘手,但如果你只能返回一個List界面,它就可以了,所以你之后的任何人都可以隨時實現你的列表。

我知道這個答案接近最終答案,但我的答案回答了如何在使用List時完成所有這些 - 通用父級 - 而不是ArrayList

List<String> shallowClonedList = new ArrayList<>(listOfStrings);

請記住,這只是一個淺而非深的副本,即。 你得到一個新的列表,但條目是相同的。 簡單的字符串就沒問題了。 當列表條目是對象本身時,變得更棘手。

這應該也有效:

ArrayList<String> orig = new ArrayList<String>();
ArrayList<String> copy = (ArrayList<String>) orig.clone()

克隆ArrayLists時要非常小心。 在Java中克隆很淺。 這意味着它只會克隆Arraylist本身而不是其成員。 因此,如果您有一個ArrayList X1並將其克隆到X2中,X2中的任何更改也將在X1中顯示,反之亦然。 克隆時,您將只生成一個新的ArrayList,其中包含指向原始元素中相同元素的指針。

ArrayList first = new ArrayList ();
ArrayList copy = (ArrayList) first.clone ();

我不是一個java專業人士,但我有同樣的問題,我試圖通過這種方法解決。 (假設T有一個復制構造函數)。

 public static <T extends Object> List<T> clone(List<T> list) {
      try {
           List<T> c = list.getClass().newInstance();
           for(T t: list) {
             T copy = (T) t.getClass().getDeclaredConstructor(t.getclass()).newInstance(t);
             c.add(copy);
           }
           return c;
      } catch(Exception e) {
           throw new RuntimeException("List cloning unsupported",e);
      }
}

暫無
暫無

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

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