当前位置: 首页 > article >正文

guava-Immutable(不可变集合)

写在前边

本文主要介绍Java中创建List集合的多种方式(可变、不可变、容量固定等等),以及其优缺点和区别。学到就是赚到。

new ArrayList<>(int capacity)

这是最常见的一种方式,capacity是list的初始容量,不给定初始容量的话,会有一个默认的容量10。超过就会进行扩容。扩容策略通常也是增加到大约当前容量的1.5倍。这种方式创建的List集合是一个可变的集合,可以进行增加、修改、删除操作。例如:

List<Integer> list = new ArrayList<>(2);
list.add(1); // [1]
list.add(2); // [1, 2]
list.add(3); // [1, 2, 3]
list.set(2, 4); // [1, 2, 4]
list.remove(1); // [1, 4]

Arrays.asList(T… a)

返回的是一个固定容量的List,即只能进行修改,不能进行增加和删除操作。例如

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<Integer> list = Arrays.asList(1, 2, 3);
        list.set(1, 4);
        System.out.println(list);
        try {
            list.add(4);
        } catch (Exception e) {
            e.printStackTrace();
        }
        try {
            list.remove(1);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

运行结果:
![[Pasted image 20240909185634.png]]

源码分析

我们去Arrays.asList的源码中可以看到,他其实是Arrays类的一个私有静态内部类:
![[Pasted image 20240909190023.png]]
继承了AbstractList,实现了get,set等方法,但是并没有实现add和remove方法。此时调用add或remove就会调用AbstractList的add和remove方法,而方法的实现是直接抛出异常UnsupportedOperationException。

在这里插入图片描述

Collections.unmodifiableList(list)

看方法名称就知道他是jdk的Collections中的方法,他的作用是返回一个不可变的集合,即不可以增加、修改、删除操作。例如:

List<Integer> list = new ArrayList();
list.add(1);
list.add(2);
List<Integer> unmodifiableList = Collections.unmodifiableList(list);
unmodifiableList.add(3);

运行结果:![[Pasted image 20240909190559.png]]
但是有一点瑕疵存在,我们去修改list,然后再观察unmodifiableList。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList();
        list.add(1);
        list.add(2);
        List<Integer> unmodifiableList = Collections.unmodifiableList(list);
        list.add(3);
        System.out.println(unmodifiableList);
    }
}

运行结果:
在这里插入图片描述

当原始集合发生了修改,不可变的集合也跟着发生了修改。所以Collections.unmodifiableList创建的并不是真正意义上的不可变集合。对源码的分析,这里就不进行介绍了,因为我们有更好的不可变集合,是Google 公司开源guava工具库中的ImmutableList。

不可变集合

  • ImmutableList
  • ImmutableMap
  • ImmutableSet

  • 这些集合都是是google guava的一个工具类提供的一个不可变的集合,如果一个对象实例不能被更改就是一个Immutable的对象,适合永久性不会更改的配置。

不可变集合的好处

  • 保证线程安全。在并发程序中,使用不可变集合既保证线程的安全性,也大大地增强了并发时的效率(跟并发锁方式相比)。
  • 如果一个对象不需要支持修改操作,不可变的集合将会节省空间和时间的开销。
  • 可以当作一个常量来对待,并且集合中的对象在以后也不会被改变。

代码测试

List<Integer> list = Lists.newArrayList(1, 2);
ImmutableList<Integer> immutableList = ImmutableList.copyOf(list);
immutableList.add(3);

抛出异常UnsupportedOperationException,然后我们也去修改list并观察immutableList,会发现list变了但是immutableList并不会收到任何影响:

import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Lists;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<Integer> list = Lists.newArrayList(1, 2);
        ImmutableList<Integer> immutableList = ImmutableList.copyOf(list);
        list.add(3);
        System.out.println("list: " + list);
        System.out.println("immutableList: " + immutableList);
    }
}

运行结果:
![[Pasted image 20240909191451.png]]

总结

说了这么多,我的目的就是介绍guava工具库,它里边有许多能够增加我们开发效率的工具,这个不可变集合只是其中的一个,还有好多就比如Java8中的Optional就是从guava工具库借鉴过去的,但是guava的更加全面,使用起来更加方便。


http://www.kler.cn/a/297078.html

相关文章:

  • MybatisPlus 快速入门
  • 硬件工程师笔试面试知识器件篇——电容
  • ActiveMQ 反序列化漏洞复现(CVE-2015-5254)
  • 编译安装调试 scaLapack 和 openmpi 以及 lapack
  • 干货分享:2024四大录音转文字工具推荐!
  • 构建Web3社交平台:DeBox式DApp开发全攻略
  • docker-mysql容器数据卷挂载
  • Qt_环境搭建
  • Benchmark.NET:让 C# 测试程序性能变得既酷又简单
  • 南卡、韶音、墨觉:精选三款旗舰骨传导耳机全面对比评测!
  • Qt篇——Qt在msvc编译下提示“C2001:常量中有换行符“的错误
  • ORCAD出BOM--位号在同一个Excel格子里
  • Golang的panic和recover
  • 哈希表,算法
  • 软件工程知识点总结(3):需求分析(二)——分析模型建模
  • 无人机之动力系统篇
  • Python Flask_APScheduler定时任务的正确(最佳)使用
  • RuoYi-Vue若依框架-系统监控内定时任务的使用
  • 深圳市2025年重大项目计划开放申报,9月23日申报截止
  • 以实时,见未来——DolphinDB 2024 年度峰会圆满举办