使用Collections.unmodifiableCollection方法
Java提供了Collections.unmodifiableCollection方法,可以将一个集合包装成一个不可修改的视图。对这个视图的修改操作将会抛出UnsupportedOperationException。
import java.util.*;
public class UnmodifiableCollectionExample {public static void main(String[] args) {List<String> list = new ArrayList<>(Arrays.asList("A", "B", "C"));Collection<String> unmodifiableList = Collections.unmodifiableCollection(list);// 传递不可修改的集合给函数printCollection(unmodifiableList);// 尝试修改集合将抛出 UnsupportedOperationException// unmodifiableList.add("D"); // 这行代码会抛出异常}public static void printCollection(Collection<String> collection) {for (String item : collection) {System.out.println(item);}}
}
使用Collections.unmodifiable
对于特定类型的集合,如List、Set和Map,Java 提供了相应的不可修改视图方法:
Collections.unmodifiableList
Collections.unmodifiableSet
Collections.unmodifiableMap
import java.util.*;
publicclass UnmodifiableSpecificCollectionsExample {public static void main(String[] args) {List<String> list = new ArrayList<>(Arrays.asList("A", "B", "C"));List<String> unmodifiableList = Collections.unmodifiableList(list);Set<String> set = new HashSet<>(Arrays.asList("X", "Y", "Z"));Set<String> unmodifiableSet = Collections.unmodifiableSet(set);Map<String, Integer> map = new HashMap<>();map.put("One", 1);map.put("Two", 2);Map<String, Integer> unmodifiableMap = Collections.unmodifiableMap(map);// 传递不可修改的集合给函数printList(unmodifiableList);printSet(unmodifiableSet);printMap(unmodifiableMap);// 尝试修改集合将抛出 UnsupportedOperationException// unmodifiableList.add("D"); // 这行代码会抛出异常// unmodifiableSet.add("W"); // 这行代码会抛出异常// unmodifiableMap.put("Three", 3); // 这行代码会抛出异常}public static void printList(List<String> list) {for (String item : list) {System.out.println(item);}}public static void printSet(Set<String> set) {for (String item : set) {System.out.println(item);}}public static void printMap(Map<String, Integer> map) {for (Map.Entry<String, Integer> entry : map.entrySet()) {System.out.println(entry.getKey() + ": " + entry.getValue());}}
}
使用Collections.unmodifiableCollection递归包装嵌套集合
如果集合中包含嵌套集合(例如一个List中包含Set),你需要递归地将所有嵌套集合也包装成不可修改的视图。
import java.util.*;
publicclass UnmodifiableNestedCollectionsExample {public static void main(String[] args) {List<Set<String>> listOfSets = new ArrayList<>();listOfSets.add(new HashSet<>(Arrays.asList("A", "B", "C")));listOfSets.add(new HashSet<>(Arrays.asList("X", "Y", "Z")));List<Set<String>> unmodifiableListOfSets = new ArrayList<>();for (Set<String> set : listOfSets) {unmodifiableListOfSets.add(Collections.unmodifiableSet(set));}Collection<List<Set<String>>> unmodifiableCollection = Collections.unmodifiableCollection(Collections.singletonList(unmodifiableListOfSets));// 传递不可修改的集合给函数printNestedCollection(unmodifiableCollection);// 尝试修改集合将抛出 UnsupportedOperationException// unmodifiableListOfSets.get(0).add("D"); // 这行代码会抛出异常}public static void printNestedCollection(Collection<List<Set<String>>> collection) {for (List<Set<String>> list : collection) {for (Set<String> set : list) {for (String item : set) {System.out.println(item);}}}}
}
通过以上可以确保传递给函数的集合不会被修改,从而保证集合的不可变性。