我對Collections
的API有unmodifiableList
API的查詢。對Collections.unmodifiableList()行爲的查詢
代碼片段:
import java.util.*;
public class ReadOnlyList{
public static void main(String args[]){
List<String> list = new ArrayList<String>();
list.add("Stack");
list.add("Over");
List list1 = Collections.unmodifiableList(list);
//list1.add("Flow");
list.add("Flow");
System.out.println("sizes:1:2:"+list.size()+":"+list1.size());
for (Iterator it = list1.iterator();it.hasNext();){
System.out.println("elements:"+it.next());
}
System.out.println("__________");
list.remove("Flow");
for (Iterator it = list1.iterator();it.hasNext();){
System.out.println("elements:"+it.next());
}
}
}
我知道,我不能修改unmodifible收集,因此我會得到錯誤
//list1.add("Flow");
我預計我會得到只讀列表list
可變,直到我創建unmodifiableList
。但是即使在創建這個list1
之後,父列表中的更改也會反映在子列表中list1
我無法修改子不可修改列表,但仍然收到父列表的修改。這對我來說是一個驚喜。
我知道修正是從父級創建新的集合,但stil不理解上述行爲。
'Collections.unmodifiableList(list);'將創建一個'list'包裝器,它在所有修改方法中引發異常,並將所有讀取方法委託給列表本身。因此對'list'所做的更改將反映在'list1'中。我想你想創建一個副本,例如'Collections.unmodifiableList(new ArrayList <>(list))'(即你創建一個列表的副本並用不可修飾的包裝器包裝它)。 – Thomas
這應該不是一個驚喜,文檔指出這只是原始集合的一個視圖。這就是爲什麼每當數據來源超出我們的控制範圍時,我們總是會做出防禦**副本**。不可修改的**視圖**僅在相反的情況下有用:當您控制原始數據源(基礎集合)並且您想將其展示給某人而不允許它們混淆原始列表時。 – biziclop
「但stil不理解上述行爲」 - 你對這種行爲不瞭解的是什麼?正如biziclop提到的那樣,Javadoc明確指出該方法在內部列表上返回一個視圖,該視圖不能通過該視圖進行修改,但它從不會對原始列表進行任何說明。 –