Java之不可变集合
2023-12-14 09:32:58
一、什么是不可变集合
不可变集合是指一旦创建后,只能遍历,不能再被修改、删除的集合。
二、不可变集合的创建
1、创建不可变的List集合
List<String> list = List.of("a","b","c");
// 正常遍历
for(String s : list){
System.out.println(s);
}
list.add("d"); // 报错
2、创建不可变的Set集合
// 里面参数必须保证唯一性
Set<String> set = Set.of("a","b","c")
// 正常遍历
for(String s : set){
System.out.println(s);
}
set.remove("a"); // 报错
?3、创建不可变的Map集合
// 第一个参数和第二个参数认为是一个键值对
// 键不能重复
// 参数有上限,最多只能传递20个参数,也就是10个键值对
Map<String,String> map = Map.of("1","a","2","b","3","c");
// 正常遍历
Set<String> keys = map.keySet();
for(String key : keys ){
String value = map.get(key);
System.out.println(key + "=" + value);
}
// 创建Map不可变集合,键值对数量超过10个
HashMap<String,String> hm = new HashMap<>();
hm.put("1","a");
hm.put("2","b");
hm.put("3","c");
hm.put("4","d");
hm.put("5","e");
hm.put("6","f");
hm.put("7","g");
hm.put("8","h");
hm.put("9","i");
hm.put("10","j");
hm.put("11","k");
// 获取不可变集合
// 获取键值对对象
Set<Map.Entry<String,String>> entries = hm.entrySet();
// 把entries 变成一个数组
// toArray 方法在底层会比较集合的长度跟数组的长度两者的大小
// 如果集合的长度>数组的长度:数据在数组中放不下,此时会根据实际数据的个数,重新创建数组
// 如果集合的长度<=数组的长度:数据在数组中放的下,此时不会创建新的数组,而是直接用
Map.Entry[] arr = entries.toArray(new Map.Entry[0]);
// 不可变Map集合
Map map = Map.ofEntries(arr);
map.put("a","a"); // 报错
// JDK10新增的方法获取不可变的Map集合
Map<String,String> map = Map.copyOf(hm);
三、不可变集合的优势
线程安全:不可变集合在多线程环境中是线程安全的,无需额外的同步操作。由于不可变集合的内容无法修改,多个线程可以同时访问和使用,不会出现线程安全问题。
性能优化:由于不可变集合的内容不可改变,因此无需进行一些额外的操作,如扩容,重新计算哈希值等。这些操作会导致性能的损耗。因此,使用不可变集合可以提高性能。
可重用性:不可变集合的内容无法修改,可以被多个线程共享使用,避免了复制集合的开销。多个线程可以同时引用同一个不可变集合对象,而不需要担心修改导致的问题。
安全性:不可变集合不允许修改操作,可以避免意外的修改操作,提高代码的安全性。这对于某些关键数据的保护非常重要。
值得信赖:不可变集合可以确保集合的内容不变,保持了一致性。这对于某些数据的可信度要求很高的场景非常重要。
文章来源:https://blog.csdn.net/lghlhg/article/details/134986236
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!