gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:09:22 25 4
gpt4 key购买 nike

通过查看Collections的代码类,我知道当我们使用 unmodifiableList(List list)unmodifiableCollection(Collection c) 方法时,它并没有创建一个新对象,而是返回了引用同一对象并覆盖可以修改 List 的方法 [ add, addall, remove, 保留所有 ... ]
所以我运行了这个测试:

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 的新对象(但这不是公共(public)类),它获取原始列表,并委托(delegate)所有它的方法除了会修改它的方法。

重点是,如文档中所述:

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

举个例子:您有一个 List 设备,您的 API 已检测到并可以操作这些设备,并且您希望为它们提供 API 的客户端。但他不应该改变它们。所以你有两个选择:

  • 给他一份你的List的深拷贝,这样即使他修改了它,也不会改变你的列表
  • 给他一个不可修改的集合 - 他无法修改它,而您则免于创建新集合。

现在您的问题标题有了答案 - 不可修改的列表是原始集合的 View 。因此,如果您需要向其中添加一个新项目 - 例如,您发现了一个刚刚插入的新设备,客户将能够在他们的不可修改的 View 中看到它。

关于java - 如果我们有原始的,为什么我们可以更改不可修改的列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3650701/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com