当前位置: 首页 > 面试题库 >

如果有原始清单,为什么我们可以更改不可修改清单?

督瑞
2023-03-14
问题内容

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

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

如文档中所述,重点是:

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

因此,举一个例子:您有一个ListAPI已检测到并且可以运行的设备,并且想要为它们提供API的客户端。但是他不应该 改变 他们。因此,您有两种选择:

  • 给他一份您的深拷贝List,以便即使他修改了它,也不会改变 您的 列表
  • 给他一个无法修改的收藏集-他无法对其进行修改,因此您无需创建新收藏集。

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



 类似资料:
  • 问题内容: 这个问题已经在这里有了答案 : 分配后列表意外更改。如何克隆或复制它以防止这种情况? (21个回答) 5年前关闭。 我有一个简单的代码如下: 最初,我使用上面显示的值定义一个列表,然后将该列表复制到一个临时列表中。我尝试了两种复制方法。然后,我使用列表执行交换功能,然后再次打印原始列表。结果,原始列表被更改。这种行为背后的原因是什么? 问题答案: 复制 外部 列表,但复制3个较短的列表

  • 本文向大家介绍Objective C中可修改和不可以修改类型。相关面试题,主要包含被问及Objective C中可修改和不可以修改类型。时的应答技巧和注意事项,需要的朋友参考一下 答案:可修改不可修改的集合类。这个我个人简单理解就是可动态添加修改和不可动态添加修改一样。 比如NSArray和NSMutableArray。前者在初始化后的内存控件就是固定不可变的,后者可以添加等,可以动态申请新的内存

  • 问题内容: 我知道ES6尚未标准化,但是目前许多浏览器都支持 JS中的关键字。 规范中写道: 常量的值不能通过重新分配而更改,并且常量也不能重新声明。因此,尽管可以在不初始化的情况下声明常量,但这样做是没有用的。 当我做这样的事情: 我看到一切正常仍和是。 但是,如果这样做,我的常量数组已更改。现在是这样,顺便说一句,我仍然无法用更改它。 我这是一个错误,还是我错过了什么?我在最新的chrome和

  • 问题内容: 我试图更改HTML表单,输入类型文件。这是我的代码: HTML,表格ID =表格 .CSS 这两种方法均无效。我确实从某些网站(如Facebook,YouTube,Google或Twitter)看到,它们具有不同的风格。想知道他们是如何做到的。 问题答案: 您不能对输入类型的文件执行任何操作(巨大的黑客攻击除外)。我知道这听起来很可怕,但是Web标准仍然没有提出解决方案。 但是我建议您

  • 本文向大家介绍React为什么不要直接修改state?如果想修改怎么做?相关面试题,主要包含被问及React为什么不要直接修改state?如果想修改怎么做?时的应答技巧和注意事项,需要的朋友参考一下 不能直接修改state,组件修改state,并不会重新触发render. state的更新是异步的,调用setState时,组件state并不会立即改变,只是把要修改的状态放入事件队列当中. this

  • 我是 Azure 广告的新手。我正在关注微软提供的文档。这是该链接的链接 https://docs.microsoft.com/en-us/azure/java/spring-framework/configure-spring-boot-starter-java-app-with-azure-active-directory#summary 在本文中,重定向Uri被称为http://localh