如何创建可修改元素值但无法增删元素的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
相关产品推荐
相关产品推荐

