java基础概念55-不可变集合
一、定义
不可变集合:不可以被修改的集合,只能查询。(长度、内容均不可被修改)
二、创建不可变集合
【注意】:
此方法是在JDK9中引入的。
2-1、list不可变集合
示例:
import java.util.List;
public class ListOfExample {
public static void main(String[] args) {
// 创建一个不可变的列表
List<String> immutableList = List.of("apple", "banana", "cherry");
// 尝试添加元素,会抛出 UnsupportedOperationException
// immutableList.add("date");
// 尝试修改元素,会抛出 UnsupportedOperationException
// immutableList.set(0, "apricot");
// 尝试删除元素,会抛出 UnsupportedOperationException
// immutableList.remove("apple")
// 遍历列表
for (String fruit : immutableList) {
System.out.println(fruit);
}
// 获取列表元素
System.out.println(immutableList.get(0));
}
}
使用 Collections.unmodifiableList
方法是在 JDK 8 中创建不可变 List
的一种常见方式。
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class ImmutableListExample {
public static void main(String[] args) {
// 创建一个可变的 ArrayList
List<String> mutableList = new ArrayList<>();
mutableList.add("Apple");
mutableList.add("Banana");
mutableList.add("Cherry");
// 将可变的 ArrayList 转换为不可变的 List
List<String> immutableList = Collections.unmodifiableList(mutableList);
// 尝试添加元素,会抛出 UnsupportedOperationException
// immutableList.add("Date");
// 尝试修改元素,会抛出 UnsupportedOperationException
// immutableList.set(0, "Apricot");
// 遍历不可变的 List
for (String fruit : immutableList) {
System.out.println(fruit);
}
}
}
2-2、Set不可变集合
【注意】:
若是Set.of赋值重复,会报错!
set集合是没有索引的!!!
使用 Collections.unmodifiableSet
方法是在 JDK 8 中创建不可变 List
的一种常见方式。
2-3、Map不可变集合
1、键值对数量不超过10个
自动匹配键值对!
【注意】:
key不能重复,否则会报错!
【注意】:Map里面的of方法,参数是有上限的,最多只能传递20个参数,10个键值对。
原因:
可变参数必须在形参的最后!
【解决】:将key, value看成一个整体!
2、键值对数量超过10个
示例1:
简化:
示例2:
import java.util.Map;
import static java.util.Map.entry;
public class ImmutableMapExample {
public static void main(String[] args) {
// 创建包含多个键值对的不可变 Map
Map<String, Integer> immutableMap = Map.ofEntries(
entry("key1", 1),
entry("key2", 2),
entry("key3", 3),
entry("key4", 4),
entry("key5", 5),
entry("key6", 6),
entry("key7", 7),
entry("key8", 8),
entry("key9", 9),
entry("key10", 10),
entry("key11", 11)
);
// 尝试添加元素,会抛出 UnsupportedOperationException
// immutableMap.put("key12", 12);
// 尝试修改元素,会抛出 UnsupportedOperationException
// immutableMap.put("key1", 100);
// 遍历 Map
for (Map.Entry<String, Integer> entry : immutableMap.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
}
}
如果,使用的 Java 版本低于 9,你可以使用 Collections.unmodifiableMap
方法将一个可变 Map
转换为不可变 Map
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
public class ImmutableMapBeforeJava9 {
public static void main(String[] args) {
Map<String, Integer> mutableMap = new HashMap<>();
mutableMap.put("key1", 1);
mutableMap.put("key2", 2);
mutableMap.put("key3", 3);
mutableMap.put("key4", 4);
mutableMap.put("key5", 5);
mutableMap.put("key6", 6);
mutableMap.put("key7", 7);
mutableMap.put("key8", 8);
mutableMap.put("key9", 9);
mutableMap.put("key10", 10);
mutableMap.put("key11", 11);
// 将可变 Map 转换为不可变 Map
Map<String, Integer> immutableMap = Collections.unmodifiableMap(mutableMap);
// 尝试添加元素,会抛出 UnsupportedOperationException
// immutableMap.put("key12", 12);
// 尝试修改元素,会抛出 UnsupportedOperationException
// immutableMap.put("key1", 100);
// 遍历 Map
for (Map.Entry<String, Integer> entry : immutableMap.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
}
}