gpt4 book ai didi

java - Collections.unmodifiableSet() 在 Java 中做了什么?

转载 作者:IT老高 更新时间:2023-10-28 21:04:35 27 4
gpt4 key购买 nike

我可以看到 Collections.unmodifiableSet返回给定集合的不可修改 View ,但我不明白为什么我们不能只使用 final 修饰符来完成此操作。

在我的理解中,final 声明了一个常量:不能修改的东西。所以,如果一个集合被声明为一个常量,那么它就不能被修改:不能从集合中删除任何东西,也不能添加任何东西。

为什么我们需要 Collections.unmodifiableSet

最佳答案

final 声明了一个不能修改的对象引用,例如

private final Foo something = new Foo();

创建一个新的 Foo 并将引用放在 something 中。此后,无法更改 something 以指向 Foo 的不同实例。

不会阻止修改对象的内部状态。我仍然可以调用相关范围可访问的 Foo 上的任何方法。如果其中一个或多个方法修改了该对象的内部状态,则 final 不会阻止。

因此,如下:

private final Set<String> fixed = new HashSet<String>();

会创建一个无法添加或以其他方式更改的Set;它只是意味着 fixed 只会引用该实例。

相比之下,做:

private Set<String> fixed = Collections.unmodifiableSet( new HashSet<String>() );

创建一个 Set 的实例,如果尝试调用 fixed.add()fixed,它将抛出 UnsupportedOperationException。 remove(),例如 - 对象本身将保护其内部状态并防止其被修改。

为了完整起见:

private final Set<String> fixed = Collections.unmodifiableSet( new HashSet<String>() );

创建一个 Set 的实例,它不允许更改其内部状态,也意味着 fixed 只会指向该集合的一个实例.

final 可用于创建基元常量的原因是基于值不能更改的事实。请记住,上面的 fixed 只是一个引用 - 一个包含无法更改地址的变量。好吧,对于原语,例如

private final int ANSWER = 42;

ANSWER 的值是 42。由于 ANSWER 无法更改,它永远只有 42 的值。

模糊所有线条的示例如下:

private final String QUESTION = "The ultimate question";

根据上述规则,QUESTION 包含代表“终极问题”的 String 实例的地址,并且该地址不能更改。这里要记住的是 String 本身是不可变的 - 你不能对改变它的 String 实例做任何事情,以及任何会这样做的操作(如 replacesubstring 等)返回对完全不同的 String 实例的引用。

关于java - Collections.unmodifiableSet() 在 Java 中做了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2420096/

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