這個問題在這里已經有了答案: 在 Java 中為物件清除或設定 null (7 個回答) 8 小時前關閉。
List介面并沒有強制執行的Javadoc添加元素的副本,但ArrayList和LinkedList兩個復制它們(如果我理解正確的源代碼)。
那么,我對clear()這段代碼中添加的串列安全嗎?我猜不是?
@Test
void test() {
List<MyObject> original = new ArrayList<>();
original.add(new MyObject("John", 1));
original.add(new MyObject("David", 2));
List<MyObject> newList = new LinkedList<>(); // or ArrayList, both can pass the test, but not sure about other impl.
newList.addAll(original);
original.clear();
System.gc();
for (MyObject o: newList) {
assertThat(o, CoreMatchers.notNullValue());
}
}
在代碼審查中看到這樣的問題,添加的串列在 addAll() 之后被清除,不確定我是否可以讓這個通過。
uj5u.com熱心網友回復:
LinkedList.addAll() 和 ArrayList.addAll() 都將元素復制到新串列中。LinkedList.addAll() 內部呼叫 toArray(),ArrayList.addAll() 呼叫 arraycopy()。
所以對 original.clear() 的呼叫應該只影響 original,而不是 newList。
我可以想到一個行為略有不同的串列實作:CopyOnWriteArrayList.addAll() 有一個例外,所以如果源是另一個 CopyOnWriteArrayList,它只需要源的陣列。但是,所有寫操作,包括清除,都從頭開始。所以最后, clear() 的行為應該仍然相同。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/314360.html
下一篇:從R中的串列串列中獲取行名稱
