You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建可修改元素值但无法增删元素的Java List/Map/Collection?

可行,具体实现方法如下

一、List 的实现

用Collections.unmodifiableList()包装普通List,或者用Java 9+的List.of()直接初始化:

// 方式1:包装已有List
List<User> original = new ArrayList<>();
original.add(new User("张三", 25));
original.add(new User("李四", 30));
List<User> fixedList = Collections.unmodifiableList(original);

// 方式2:Java 9+ 直接初始化
List<User> fixedList = List.of(new User("张三",25), new User("李四",30));

使用说明:

  • 可正常修改元素属性:fixedList.get(0).setAge(26);
  • 尝试添加/移除元素会抛出UnsupportedOperationException,比如fixedList.add(...)或fixedList.remove(...)都会报错。

注意:方式1中不要修改原始的original List,否则fixedList的内容会同步变化;方式2的List.of()是一次性初始化,不存在这个问题。

二、Map 的实现

同理,用Collections.unmodifiableMap()或Java 9+的Map.of():

// 方式1:包装已有Map
Map<String, User> original = new HashMap<>();
original.put("zhangsan", new User("张三",25));
original.put("lisi", new User("李四",30));
Map<String, User> fixedMap = Collections.unmodifiableMap(original);

// 方式2:Java 9+ 直接初始化
Map<String, User> fixedMap = Map.of(
    "zhangsan", new User("张三",25),
    "lisi", new User("李四",30)
);

使用说明:

  • 修改元素属性:fixedMap.get("zhangsan").setAge(26);
  • 增删或替换键值对会报错,比如fixedMap.put(...)、fixedMap.remove(...)均不允许。

三、其他Collection(如Set)

对应使用Collections.unmodifiableSet()或Java 9+的Set.of(),逻辑完全一致:

Set<User> original = new HashSet<>();
original.add(new User("张三",25));
original.add(new User("李四",30));
Set<User> fixedSet = Collections.unmodifiableSet(original);

// 修改元素属性
for (User u : fixedSet) {
    if ("张三".equals(u.getName())) {
        u.setAge(26);
    }
}

// 增删元素报错:fixedSet.add(...) 会抛出异常

核心原理

这些方法生成的是不可修改视图,它们仅限制集合的结构变化(增删元素、替换元素),不会限制集合内元素本身的修改——只要元素是可变类(存在setter方法、属性非final),就能正常修改其属性。

内容的提问来源于stack exchange,提问作者Meme Man

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 04:36:17