如何确保函数不能修改集合

👌如何确保函数不能修改集合?

题目详细答案

使用Collections.unmodifiableCollection方法

Java提供了Collections.unmodifiableCollection方法,可以将一个集合包装成一个不可修改的视图。对这个视图的修改操作将会抛出UnsupportedOperationException。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import java.util.*;

public class 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),你需要递归地将所有嵌套集合也包装成不可修改的视图。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import java.util.*;

public class 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);
}
}
}
}
}

通过以上可以确保传递给函数的集合不会被修改,从而保证集合的不可变性。

 wechat
天生我才必有用