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);

三、不可变集合的优势

  1. 线程安全:不可变集合在多线程环境中是线程安全的,无需额外的同步操作。由于不可变集合的内容无法修改,多个线程可以同时访问和使用,不会出现线程安全问题。

  2. 性能优化:由于不可变集合的内容不可改变,因此无需进行一些额外的操作,如扩容,重新计算哈希值等。这些操作会导致性能的损耗。因此,使用不可变集合可以提高性能。

  3. 可重用性:不可变集合的内容无法修改,可以被多个线程共享使用,避免了复制集合的开销。多个线程可以同时引用同一个不可变集合对象,而不需要担心修改导致的问题。

  4. 安全性:不可变集合不允许修改操作,可以避免意外的修改操作,提高代码的安全性。这对于某些关键数据的保护非常重要。

  5. 值得信赖:不可变集合可以确保集合的内容不变,保持了一致性。这对于某些数据的可信度要求很高的场景非常重要。

文章来源:https://blog.csdn.net/lghlhg/article/details/134986236
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。