Java中的不可变集合介绍

不可变集合介绍

Java中的不可变集合是一种特殊的集合,它们不允许在创建后修改它们的内容。在Java中,不可变集合是通过在创建后将其元素设为不可修改来实现的。

不可变集合的好处是它们是线程安全的,因为它们不允许修改操作。此外,它们还可以提高性能,因为它们可以缓存哈希码和计算结果。缺点是如果需要频繁地修改集合,则不可变集合可能不是最佳选择。

如何创建

Java中的Collections类提供了三个方法:unmodifiableSet、unmodifiableMap和unmodifiableList,用于创建不可变的集合,它们的详细介绍如下:

1、unmodifiableSet:将一个可变的Set对象转换为不可变的Set对象。返回的不可变Set对象包含原始集合中的所有元素,但不允许添加、删除或修改任何元素。

2、unmodifiableMap:将一个可变的Map对象转换为不可变的Map对象。返回的不可变Map对象包含原始映射表中的所有键值对,但不允许添加、删除或修改任何键值对。

3、unmodifiableList:将一个可变的List对象转换为不可变的List对象。返回的不可变List对象包含原始列表中的所有元素,但不允许添加、删除或修改任何元素。

创建不可变的List集合

开始创建

List<String> list = new ArrayList<>(Arrays.asList("张三", "李四", "王五", "赵六"));
List<String> immutableList = Collections.unmodifiableList(list);

单个输出

System.out.println(immutableList.get(0));
System.out.println(immutableList.get(1));
System.out.println(immutableList.get(2));
System.out.println(immutableList.get(3));

通过增强for输出

for (String name : immutableList) {
    System.out.println(name);
}

通过迭代器输出

Iterator<String> iterator = immutableList.iterator();
while(iterator.hasNext()){
    String name = iterator.next();
    System.out.println(name);
}

通过for循环输出

for (int i = 0; i < immutableList.size(); i++) {
    String name = immutableList.get(i);
    System.out.println(name);
}

通过lamdba+stream输出

immutableList.forEach(System.out::println);

执行写操作(增删改)

immutableList.remove("李四"); //抛出UnsupportedOperationException
immutableList.add("田七"); //抛出UnsupportedOperationException
immutableList.set(0,"田七"); //抛出UnsupportedOperationException

创建不可变的Set集合

开始创建

当我们要创建一个不可变的Set集合时,里面的参数一定要保证唯一性,参数的值重复了会被HashSet自动剔除。

Set<String> set = new HashSet<>();
set.add("张三");
set.add("张三");
set.add("李四");
set.add("王五");
set.add("赵六");
Set<String> immutableSet = Collections.unmodifiableSet(set);

通过增强for输出

for (String name : immutableSet) {
    System.out.println(name);
}

通过迭代器输出

Iterator<String> iterator = immutableSet.iterator();
while(iterator.hasNext()){
    String name = iterator.next();
    System.out.println(name);
}

通过lamdba+stream输出

immutableSet.forEach(System.out::println);

执行写操作(增删改)

immutableSet.remove("王五"); //抛出UnsupportedOperationException

拓展(HashSet去重原理)

HashSet 是 Java 中的一种集合类型,它的主要特点是不允许出现重复的元素。

HashSet 的去重原理是基于散列表(Hash Table)实现的。在 HashSet 中,每个元素都会被映射到一个整数值,称为“哈希值”,而这个哈希值就是通过调用元素的 hashCode() 方法计算得出的。

具体的去重流程如下:

1、当向 HashSet 中添加一个新元素时,先调用该元素的 hashCode() 方法计算出它的哈希值。

2、然后将该元素的哈希值作为索引,查找 HashSet 中对应的位置,如果该位置为空,就直接将该元素添加到该位置。

3、如果该位置已经存在元素,则需要判断该元素是否和要添加的元素相等,即通过 equals() 方法比较两个元素是否相等。如果相等,就不再添加,如果不相等,则继续探测下一个位置,直到找到一个空位置或者找到了相等的元素为止。

通过这种方式,HashSet 中的元素就能够实现去重,而且添加、删除和查找元素的时间复杂度都是 O(1) 级别的。但是需要注意的是,如果两个元素的 hashCode() 方法返回值相同,但是 equals() 方法返回 false,那么这两个元素仍然会被视为不同的元素。因此,为了保证 HashSet 的正确性,需要保证对象的 hashCode() 和 equals() 方法的正确实现。

创建不可变的Map集合

开始创建

当我们要创建一个不可变的map集合时,里面的键一定要保证唯一性。

Map<String, Integer> map = new HashMap<>();
map.put("张三", 20);
map.put("李四", 21);
map.put("王五", 19);
map.put("赵六", 18);
Map<String, Integer> immutableMap = Collections.unmodifiableMap(map);

通过增强for输出

Set<String> keys = immutableMap.keySet();
for (String key : keys) {
    Integer value = immutableMap.get(key);
    System.out.println(key + " -> " + value);
}
for (Map.Entry<String, Integer> entry : immutableMap.entrySet()) {
    String key = entry.getKey();
    Integer value = entry.getValue();
    System.out.println(key + " -> " + value);
}

通过迭代器输出

Iterator<Map.Entry<String, Integer>> iterator = immutableMap.entrySet().iterator();
while (iterator.hasNext()) {
    Map.Entry<String, Integer> entry = iterator.next();
    String key = entry.getKey();
    Integer value = entry.getValue();
    System.out.println(key + " -> " + value);
}

通过lamdba+stream输出

immutableMap.entrySet().stream()
        .forEach(entry -> System.out.println(entry.getKey() + " -> " + entry.getValue()));

HashMap底层原理

HashMap,这一篇就够了_"尚硅谷 逻辑测验题 system.out.println(map.get(\"张三\"));"_长头发的程序猿的博客-CSDN博客

猜你喜欢

转载自blog.csdn.net/weixin_55076626/article/details/129977572
今日推荐