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

前端之家收集整理的这篇文章主要介绍了java – 如果我们有原始列表,为什么我们可以更改不可修改的列表?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
通过查看 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 );

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

解决方法

(底部的问题答案)

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

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

关键是,如文件中所述:

Returns an unmodifiable view of the specified list. This method allows modules to provide users with “read-only” access to internal lists.

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

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

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

原文链接:https://www.f2er.com/java/124350.html

猜你在找的Java相关文章