java如何返回常量集合
在java中,有没有一种方法可以返回对类集合的引用,而我既不能更改它,也不能更改其元素的数据
那么,如果我有一个映射Map<Integer, Set<String>>
,没有主体可以获取对集合值的引用并向其添加元素
你可以在下面搜索框中键入要查询的问题!
在java中,有没有一种方法可以返回对类集合的引用,而我既不能更改它,也不能更改其元素的数据
那么,如果我有一个映射Map<Integer, Set<String>>
,没有主体可以获取对集合值的引用并向其添加元素
# 1 楼答案
通过您自己提供的方法中介对外部集合(the
Map
)的访问,可能最容易实现您的目标。然后,您可以在通过Collections.unmodifiableSet()
后返回适当的Set
对象因为
String
是不可变的,所以在那之后,调用方真的没有什么可以改变的了除此之外,您必须构造一个新的
Map
,其中填充了所有通过Collections.unmodifiableSet()
传递的集合,然后通过Collections.unmodifiableMap()
传递该集合。但是,这可能是一个好主意,也可能不是一个好主意,这取决于你的收藏有多大# 2 楼答案
您可以使用^{} 获取无法修改的地图视图
每种类型的集合都有不同的方法:
unmodifiableCollection
返回泛型集合的不可修改视图unmodifiableSet
返回集合的不可修改视图unmodifiableList
返回列表的不可修改视图unmodifiableSortedSet
返回已排序数据集的不可修改视图unmodifiableSortedMap
返回已分类地图的不可修改视图如果项本身是集合,则可以编写递归方法来构造一个新集合,该集合包含原始项的不可修改视图
一般来说,如果您存储在集合中的项目本身可以修改,那么除了制作防御性副本之外,没有什么可以阻止您这样做
# 3 楼答案
地图:
名单:
设置:
# 4 楼答案
确保a
Map
内的所有对象都不能修改的唯一方法是使对象本身不可变unmodifiableMap()
方法保证Map
不能被修改,但它对它包含的对象没有任何保证。看看this,了解如何使对象不可变。关于一个具体的例子,请参见String
类的工作原理:您不能修改字符串中的字符,所有可以更改字符串的方法(例如:toUpperCase()
)都会返回一个新的字符串。这就是您想要的Map
中对象的行为假设问题中的映射包含
Set<String>
作为其值,那么在将它们添加到映射之前对集合使用Collections.unmodifiableSet()
将使它们不可变,因为如上所述String
已经是不可变的