如果我们有原始列表,为什么我们可以更改不可修改的列表?

Rak*_*yal 7 java collections

通过查看的代码Collections类,我才知道,当我们正在使用的方法unmodifiableList(List list)或者unmodifiableCollection(Collection c)它不是创建一个新的对象,但它返回同一个对象的引用,并覆盖其可以修改方法List[ add,addall,remove,retainAll. ..]
所以我跑了这个测试:

List modifiableList = new ArrayList();
modifiableList.add ( 1 );   
List unmodifiableList = Collections.unmodifiableList( modifiableList );
// unmodifiableList.add(3);  // it will throw the exception 
modifiableList.add ( 2 );       
System.out.println( unmodifiableList );
Run Code Online (Sandbox Code Playgroud)

结果是[ 1,2 ].
现在重点是为什么它指的是同一个对象?为什么不创建新对象?

Boz*_*zho 11

(底部的问题答案)

当您创建不可修改的列表时,目的是不应该由您以外的人修改它- 即API的客户端.

该方法unmodifiableList(..)创建一个新的类型对象UnmodifiableList(但这不是公共类),它获取原始列表,并将所有方法委托给它,除了修改它的方法.

关键是,如文件中所述:

返回指定列表的不可修改视图.此方法允许模块为用户提供对内部列表的"只读"访问.

举个例子:您有一个ListAPI检测到并且可以运行的设备,并且您希望为它们提供API的客户端.但他不应该改变它们.所以你有两个选择:

  • 给他一份你的深层副本List,这样即使他修改了它,这也不会改变你的清单
  • 给他一个不可修改的集合 - 他不能修改它,你不需要创建一个新的集合.

现在,您可以找到问题标题的答案 - 不可修改的列表是原始集合的视图.因此,如果您需要向其添加新项目 - 比如说,您发现了一个刚刚插入的新设备,客户端将能够在其不可修改的视图中看到它.