在 Java 编程中,不可变集合是一种特殊类型的集合,一旦创建,其内容就不能被修改。这种特性使得不可变集合在某些场景下具有独特的优势。
创建不可变集合的应用场景
- 数据不可修改的场景:当某个数据不应该被修改时,将其防御性地拷贝到不可变集合中是一种很好的实践。例如,一些配置信息、常量数据等,将它们放在不可变集合中,可以确保在程序运行过程中其内容不会被意外修改。
- 安全调用不可信库:当集合对象需要被不可信的库调用时,使用不可变集合形式是安全的。因为不可变集合无法被外部修改,从而避免了被不可信代码篡改数据的风险。
简单理解
不可变集合的核心就是不想让别人修改集合中的内容,从而保证数据的安全性和稳定性。
创建不可变集合的书写格式
在 Java 的List、Set、Map接口中,都提供了静态的of方法,用于获取一个不可变的集合。具体方法如下:
|
方法名称 |
说明 |
|
static List of(E...elements) |
创建一个具有指定元素的 List 集合对象 |
|
static Set of(E...elements) |
创建一个具有指定元素的 Set 集合对象 |
|
static <K,V> Map<K, V> of(K k1, V v1, K k2, V v2,...) |
创建一个具有指定键值对元素的 Map 集合对象 |
注意事项
- 不可变操作限制:通过of方法创建的不可变集合,不能进行添加、删除和修改操作。一旦尝试进行这些操作,将会抛出UnsupportedOperationException异常。
- Set 集合的唯一性:当使用of方法创建不可变的Set集合时,传入的参数必须保证唯一性。如果传入重复元素,在 Java 10 及以上版本会抛出IllegalArgumentException异常。
- Map 集合的键唯一性:在创建不可变的Map集合时,键必须是唯一的。如果传入重复的键,同样会抛出IllegalArgumentException异常。
- Map 集合的参数上限:Map接口的of方法,参数是有上限的,最多只能传递 20 个参数,即 10 个键值对。如果需要传递超过 10 个键值对对象,可以使用ofEntries方法。
创建 Map 的不可变集合
细节
- 键的唯一性:同上述注意事项,Map 集合中键不能重复。
- of 方法参数上限:最多传递 20 个参数,10 个键值对。
- ofEntries 方法:当键值对数量超过 10 个时,在Map接口中可以使用ofEntries方法。该方法接受一个Map.Entry数组作为参数。
示例代码
import java.util.HashMap;
import java.util.Map;
public class ImmutableMapExample {
public static void main(String[] args) {
/* 创建Map的不可变集合,键值对的数量超过10个*/
//创建一个普通的Map集合
HashMap<String, String> hm = new HashMap<>();
hm.put("张三", "南京");
hm.put("李四", "北京");
hm.put("王五", "上海");
hm.put("赵六", "北京");
hm.put("孙七", "深圳");
hm.put("M八", "杭州");
hm.put("吴九", "字波");
hm.put("翔古", "苏州");
hm.put("刘…", "无锵");
hm.put("陈二", "嘉兴");
hm.put("aaa", "111");
//利用上边的数据来获取一个不可变的集合
// 方式一:使用ofEntries方法
Map<String, String> map1 = Map.ofEntries(hm.entrySet().toArray(new Map.Entry[0]));
// 方式二:使用copyOf方法,更为简洁
Map<String, String> map2 = Map.copyOf(hm);
System.out.println("使用ofEntries创建的不可变Map: " + map1);
System.out.println("使用copyOf创建的不可变Map: " + map2);
}
}
在上述代码中,展示了两种创建键值对数量超过 10 个的不可变Map集合的方法,一种是使用ofEntries方法,另一种是使用Map.copyOf方法,copyOf方法更为简洁直观。
希望通过这篇笔记,能帮助大家更好地理解和使用 Java 中的不可变集合,在实际编程中根据具体场景选择合适的集合类型。如果在使用过程中有任何疑问,欢迎在评论区留言交流。
内容有进一步修改意见,比如增减示例、调整结构,欢迎随时告诉我。
320

被折叠的 条评论
为什么被折叠?



