有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何返回常量集合

在java中,有没有一种方法可以返回对类集合的引用,而我既不能更改它,也不能更改其元素的数据

那么,如果我有一个映射Map<Integer, Set<String>>,没有主体可以获取对集合值的引用并向其添加元素


共 (4) 个答案

  1. # 1 楼答案

    通过您自己提供的方法中介对外部集合(the Map)的访问,可能最容易实现您的目标。然后,您可以在通过Collections.unmodifiableSet()后返回适当的Set对象

    因为String是不可变的,所以在那之后,调用方真的没有什么可以改变的了

    除此之外,您必须构造一个新的Map,其中填充了所有通过Collections.unmodifiableSet()传递的集合,然后通过Collections.unmodifiableMap()传递该集合。但是,这可能是一个好主意,也可能不是一个好主意,这取决于你的收藏有多大

  2. # 2 楼答案

    您可以使用^{}获取无法修改的地图视图

    每种类型的集合都有不同的方法:

    • unmodifiableCollection返回泛型集合的不可修改视图
    • unmodifiableSet返回集合的不可修改视图
    • unmodifiableList返回列表的不可修改视图
    • unmodifiableSortedSet返回已排序数据集的不可修改视图
    • unmodifiableSortedMap返回已分类地图的不可修改视图

    如果项本身是集合,则可以编写递归方法来构造一个新集合,该集合包含原始项的不可修改视图

    一般来说,如果您存储在集合中的项目本身可以修改,那么除了制作防御性副本之外,没有什么可以阻止您这样做

  3. # 3 楼答案

    地图:

    Map<Integer, String> myMap =
                Collections.unmodifiableMap(new HashMap<Integer, String>() {
            {
                put(1, "value1");
                put(2, "value2");
                put(3, "value3");
            }
        });
    

    名单:

    List<String> list = Collections.unmodifiableList(new ArrayList<String>() {
            {
                add("value1");
                add("value2");
                add("value3");
            }
        });
    

    设置:

    Set<String> list = Collections.unmodifiableSet(new HashSet<String>() {
            {
                add("value1");
                add("value2");
                add("value3");
            }
        });
    
  4. # 4 楼答案

    确保aMap内的所有对象都不能修改的唯一方法是使对象本身不可变

    unmodifiableMap()方法保证Map不能被修改,但它对它包含的对象没有任何保证。看看this,了解如何使对象不可变。关于一个具体的例子,请参见String类的工作原理:您不能修改字符串中的字符,所有可以更改字符串的方法(例如:toUpperCase())都会返回一个新的字符串。这就是您想要的Map中对象的行为

    假设问题中的映射包含Set<String>作为其值,那么在将它们添加到映射之前对集合使用Collections.unmodifiableSet()将使它们不可变,因为如上所述String已经是不可变的