guava之Immutable(不可变)集合

2023-11-11

一、概述

      guava是google的一个库,弥补了java语言的很多方面的不足,很多在java8中已有实现,暂时不展开。Collections是jdk提供的一个工具类。

      Guava中不可变对象和Collections工具类的unmodifiableSet/List/Map/etc的区别:

当Collections创建的不可变集合的wrapper类改变的时候,不可变集合也会改变,而Guava的Immutable集合保证确实是不可变的。

1、JDK中实现immutable集合

 在JDK中提供了Collections.unmodifiableXXX系列方法来实现不可变集合, 但是存在一些问题,下面我们先看一个具体实例:

复制代码

public class ImmutableTest {

    @Test
    public void testJDKImmutable(){
        List<String> list=new ArrayList<String>();
        list.add("a");
        list.add("b");
        list.add("c");

        //通过list创建一个不可变的unmodifiableList集合
        List<String> unmodifiableList=Collections.unmodifiableList(list);
        System.out.println(unmodifiableList);

        //通过list添加元素
        list.add("ddd");
        System.out.println("往list添加一个元素:"+list);
        System.out.println("通过list添加元素之后的unmodifiableList:"+unmodifiableList);

        //通过unmodifiableList添加元素
        unmodifiableList.add("eee");
        System.out.println("往unmodifiableList添加一个元素:"+unmodifiableList);

    }
}

复制代码

运行结果:

通过运行结果我们可以看出:虽然unmodifiableList不可以直接添加元素,但是我的list是可以添加元素的,而list的改变也会使unmodifiableList改变。

所以说Collections.unmodifiableList实现的不是真正的不可变集合。

 2、Guava的immutable集合

      Guava提供了对JDK里标准集合类里的immutable版本的简单方便的实现,以及Guava自己的一些专门集合类的immutable实现。当你不希望修改一个集合类,

或者想做一个常量集合类的时候,使用immutable集合类就是一个最佳的编程实践。 

注意:每个Guava immutable集合类的实现都拒绝null值。我们做过对Google内部代码的全面的调查,并且发现只有5%的情况下集合类允许null值,而95%的情况下

都拒绝null值。万一你真的需要能接受null值的集合类,你可以考虑用Collections.unmodifiableXXX。

immutable集合可以有以下几种方式来创建:

  1、用copyOf方法, 譬如, ImmutableSet.copyOf(set)

  2、使用of方法,譬如,ImmutableSet.of("a", "b", "c")或者ImmutableMap.of("a", 1, "b", 2)

  3、使用Builder类

举例:

复制代码

 @Test
    public void testGuavaImmutable(){

        List<String> list=new ArrayList<String>();
        list.add("a");
        list.add("b");
        list.add("c");

        ImmutableList<String> imlist=ImmutableList.copyOf(list);
        System.out.println("imlist:"+imlist);

        ImmutableList<String> imOflist=ImmutableList.of("peida","jerry","harry");
        System.out.println("imOflist:"+imOflist);

        ImmutableSortedSet<String> imSortList=ImmutableSortedSet.of("a", "b", "c", "a", "d", "b");
        System.out.println("imSortList:"+imSortList);

        list.add("baby");
        //关键看这里是否imlist也添加新元素了
        System.out.println("list添加新元素之后看imlist:"+imlist);

        ImmutableSet<Color> imColorSet =
                ImmutableSet.<Color>builder()
                        .add(new Color(0, 255, 255))
                        .add(new Color(0, 191, 255))
                        .build();

        System.out.println("imColorSet:"+imColorSet);
    }

复制代码

运行结果:发现imlist并未改变。

对于排序的集合来说有例外,因为元素的顺序在构建集合的时候就被固定下来了。譬如,ImmutableSet.of("a", "b", "c", "a", "d", "b"),对于这个集合的遍历顺序来说就是"a", "b", "c", "d"。

更智能的copyOf

copyOf方法比你想象的要智能,ImmutableXXX.copyOf会在合适的情况下避免拷贝元素的操作-先忽略具体的细节,但是它的实现一般都是很“智能”的。譬如:

复制代码

  @Test
        public void testCotyOf(){
            ImmutableSet<String> imSet=ImmutableSet.of("peida","jerry","harry","lisa");
            System.out.println("imSet:"+imSet);

            //set直接转list
            ImmutableList<String> imlist=ImmutableList.copyOf(imSet);
            System.out.println("imlist:"+imlist);

            //list直接转SortedSet
            ImmutableSortedSet<String> imSortSet=ImmutableSortedSet.copyOf(imSet);
            System.out.println("imSortSet:"+imSortSet);

            List<String> list=new ArrayList<String>();
            for(int i=0;i<=10;i++){
                list.add(i+"x");
            }
            System.out.println("list:"+list);

            //截取集合部分元素
            ImmutableList<String> imInfolist=ImmutableList.copyOf(list.subList(2, 8));
            System.out.println("imInfolist:"+imInfolist);
        }

复制代码

 运行结果

Guava集合和不可变对应关系

可变集合类型 可变集合源:JDK or Guava? Guava不可变集合
Collection JDK ImmutableCollection
List JDK ImmutableList
Set JDK ImmutableSet
SortedSet/NavigableSet JDK ImmutableSortedSet
Map JDK ImmutableMap
SortedMap JDK ImmutableSortedMap
Multiset Guava ImmutableMultiset
SortedMultiset Guava ImmutableSortedMultiset
Multimap Guava ImmutableMultimap
ListMultimap Guava ImmutableListMultimap
SetMultimap Guava ImmutableSetMultimap
BiMap Guava ImmutableBiMap
ClassToInstanceMap Guava ImmutableClassToInstanceMap
Table Guava ImmutableTable
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

guava之Immutable(不可变)集合 的相关文章

  • java字符串基础操作

    1 字符串的特点 java lang String使用了final修饰 不能被继承 字符串底层封装了字符数组及针对字符数组的操作算法 字符串一旦创建 对象内容永远无法改变 但字符串引用 可以重新赋值 Java字符串在内存中采用Unicode
  • 今天发现rabbitMQ消息堆积

    发现有三十多万的消息堆积在10的queue里没有被消费 记录一下查看问题的步骤 1 jps 找出程序的PID 2 jstack PID 查看线程dump 发现rabbitMQ的consumer worker线程block住了 Thread
  • JVM工具-jstack

    jstack 打印线程堆栈信息 支持支持本地java进程 core文件以及远程java进程 命令格式 jstack options pid jstack options executable core jstack options serv
  • Java学习笔记 --- 布尔类型

    一 布尔类型 1 布尔类型也叫boolean类型 boolean类型数据只允许取值true和false 无null public class Bool public static void main String args boolean
  • 剑指offer第二版面试题39:数组中出现次数超过一半的数字(java)

    题目描述 数组中有一个数字出现的次数超过数组长度的一半 请找出这个数字 例子说明 如输入一个长度为9的数组 1 2 3 2 2 2 5 4 2 由于数字2在数组中出现了5次 超过数组长度的一半 因此输出2 分析思路1 基于Partition
  • Java中变量的作用域【Java基础】

    最近在看 Thinking in Java 想把Java基础再巩固一下 在博客上遇到的以前没注意到的知识点或者较难的知识点记录下来 与大家分享 Java中的基本类型变量的作用域为 int x 1 变量x的作用域只在大括号内 System o
  • JAVA获取类的类对象的三种方式

    自定义一个类 MyClass 并声明该类的对象 class MyClass MyClass mClass1 new MyClass 1 2 3 在上面说过 Class 类的构造方法是私有的 只有 java 虚拟机可以调用该方法创建该类的对象
  • 【Java】Java中的String类

    文章目录 一 认识 String 类 二 String 类的常用方法 2 1 构造方法 2 2 String 类对象之间的比较 2 3 字符串查找 2 4 字符串的转换 2 5 字符串替换 2 6 字符串拆分 2 7 字符串截取 2 8 字
  • Java中的IO流如何理解——精简

    目录 引言 缓冲流 字节缓冲流 字符缓冲流 转换流 字符输入转换流 字符输出转换流 序列化和反序列化 对象序列化 对象反序列化 打印流 Properties 引言 通过前面的简单学习 我们已经能够大致了解了关于文件的操作 但是能够明显感受到
  • 一文彻底弄懂零拷贝原理

    零拷贝 零拷贝 Zero Copy 是一种 I O 操作优化技术 可以快速高效地将数据从文件系统移动到网络接口 而不需要将其从内核空间复制到用户空间 其在 FTP 或者 HTTP 等协议中可以显著地提升性能 但是需要注意的是 并不是所有的操
  • 对接百度api的工具类:Base64Util,FileUtil,HttpUtil

    对接百度api的工具类 Base64Util FileUtil HttpUtil package com baidu ai aip utils Base64 工具类 public class Base64Util private stati
  • java 模拟库存管理系统

    本案例要求编写一个程序 模拟库存管理系统 该系统内容主要包括 商品入库 商品显示 和删除商品功能 此程序用手机举例 此管理系统分别为两个类Phone 和Test类 Phone类 确定四个变量 类 1 生成空参数构造方法 2 全部参数的构造方
  • MVC模型图

    MVC图
  • Java学习13:面向对象-多态(Polymorphism)内存分析图解

    1 概述 多态是Java面向对象三大特征之一 多态 Polymorphism 顾名思义 即对象具有多种形态 具体而言 是编译时类型 运行时类型 编译时类型 由声明时的类型决定 一般是父类 运行时类型 由实际对应的对象类型决定 具体是哪个子类
  • JAVA--GUI(2)--布局

    布局 为了更好适应不同平台而引入的概念 Java的布局管理器是一个实现了LayoutManager接口的实例 用户无法设置setLocation 这些方法 如果想自己设置则需要取消布局管理器 采用布局管理器 边界布局 顺序布局 网格布局 卡
  • SM2加解密、签名验签

    导论 SM2是国家密码管理局于2010年12月17日发布的椭圆曲线公钥密码算法 在我们国家商用密码体系中被用来替换RSA算法 国产SM2算法 是基于ECC的 但二者在签名验签 加密解密过程中或许有些许区别 目前鄙人还不太清楚 后期有机会的话
  • JDK介绍

    JDK JRE和JVM之间的关系 JVM是运行环境 JRE是含运行环境和相关的类库 跟node环境是一个意思 JDK目录介绍 目录名称 说明 bin 该路径下存放了JDK的各种工具命令 javac和java就放在这个目录 conf 该路径下
  • 将list集合的元素按照添加顺序的倒序进行排列取出

    将list集合的元素按照添加顺序的倒序进行排列取出 方法1 list add 0 object List
  • java连接oracle出现ORA-12505错误

    问题 sqlplus可以连接 但java连接报错 ORA 12505 ORA 12505 TNS listener does not currently know of SID given in connect descr 解析 原因 数据
  • java连接oracle出现ORA-12505错误

    问题 sqlplus可以连接 但java连接报错 ORA 12505 ORA 12505 TNS listener does not currently know of SID given in connect descr 解析 原因 数据

随机推荐

  • hive报错:Call from hostname/127.0.1.1 to localhost:9000 failed on connection exception.主节点9000端口拒绝访问.

    1 美图 2 背景 启动hadoop base lcc lcc hadoop 2 7 4 sh sbin start all sh This script is Deprecated Instead use start dfs sh and
  • windows server 2012 r2关于vmtools安装失败以及KB2919355安装

    windows server 2012 r2关于vmtools安装失败以及KB2919355安装 前言 VMware workstation15安装windows server 2012 r2 安装不了vmtools 解决方法 1 安装低版
  • OpenCV中QR二维码的生成与识别(CIS摄像头解析)

    1 QR概述 QR Quick Response 属于二维条码的一种 意思是快速响应的意思 QR码不仅信息容量大 可靠性高 成本低 还可表示汉字及图像等多种文字信息 其保密防伪性强而且使用非常方便 更重要的是QR码这项技术是开源的 在移动支
  • python 注解annotation_Annotation注解(一)- 基础

    这篇博客 主要讲解关于注解的一些基本知识 包括注解的概念 分类 作用 常见注解的定义及其解析方式等 Annotation的概念 1 概念 关于Annotation注解的概念 我们可以看下官方的解释 Annotations a form of
  • 大数据:大规模文件系统及map-reduce

    大数据 大规模文件系统及map reduce 下面是我看 大数据 互联网大规模数据挖掘与分布式处理 一书第二章的总结 1 分布式文件系统 distributed file system 文件多副本存储 计算任务分多个 容错 文件非常大 TB
  • Linux学习之内核Oops详解

    什么是Oops 从语言学的角度说 Oops应该是一个拟声词 当出了点小事故 或者做了比较尴尬的事之后 你可以说 Oops 翻译成中国话就叫做 哎呦 哎呦 对不起 对不起 我真不是故意打碎您的杯子的 看 Oops就是这个意思 在Linux内核
  • 学习笔记 - Hadoop-Hive 介绍

    学习笔记 Hadoop Hive 介绍 1 背景 当前用户数据都是以 亿 为单位进行考量 传统数据库无法满足快速增长的海量数据存储需求 其计算和处理能力也大大不足 数据仓库有分布式存储与处理能力 将各种数据源整合集成到统一的数据中心 防止数
  • 辗转相除法、相减法求两自然数最大公约数和最小公倍数

    l 辗转相除法 算法描述 辗转相除法是求两个正整数的最大公约数的一种算法 有两整数a和b a b得余数c 若c 0 则b即为两数的最大公约数 若c 0 则a b b c 再回去执行 例如求27和15的最大公约数过程为 27 15余1215
  • 【HIT-计算机系统】ICS-Lab2 DataLab

    第1章 实验基本信息 1 1 实验目的 熟练掌握计算机系统的数据表示与数据运算 通过C程序深入理解计算机运算器的底层实现与优化 掌握VS CB GCC等工具的使用技巧与注意事项 1 2 实验环境与工具 1 2 1 硬件环境 x64 CPU
  • Vue学习笔记——第二部分

    Vue组件的定义 注册方式和模板使用 组件的定义 组件 Component 是 Vue js 最强大的功能之一 组件可以扩展 HTML 元素 封装可重用的代码 vue组件是把页面 html代码 CSS代码 进行模块化 如下图所示 一个页面分
  • 数学基础课之01二进制

    关于Java的移位符 左移位 lt lt 右移位 gt gt 表示算术右移 gt gt gt 表示逻辑右移 python同Java 由于java的二进制数最高位为符号位 0为正 1为负 右移位涉及到最左补0还是补1的问题 逻辑右移直接补0即
  • 【华为OD统一考试B卷

    在线OJ 已购买本专栏用户 请私信博主开通账号 在线刷题 运行出现 Runtime Error 0Aborted 请忽略 华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一
  • Linux 内存分配/内存管理 相关接口

    Linux 内存分配 内存管理 相关接口 分配栈内存 alloca 分配堆内存 直接分配 malloc 分配初始化空间 calloc 分配对齐空间 posix memalign aligned alloc 过时 memalign 过时 va
  • AMD的CPU装androidstudio,以及联想拯救者r7000配置虚拟化无法使用解决

    第一步就是下载安装了 基操不提了 进入androidstudio会让你选择sdk下载 选择下载这都很快 毕竟没墙 但是在你导入项目或创建项目时 需要下载对应版本的gradle 这个时候你会发现下的贼慢还去时不时的断掉 一旦断了 就要重新下
  • jmeter模拟多用户并发

    一 100个真实的用户 1 一个账号模拟100虚拟用户同时登录和100账号同时登录 区别 1 1个账号100个人用 同时登录 2 100个人100个账号 同时登录 相同 1 两个都是100人同时登录 具体看项目需求 2 账号来源 1 利用
  • 最新Intellij Idea2020.01使用JDBC连接数据库

    最新Intellij Idea2020 01创建一个普通的Java工程并用JDBC连接数据库 详尽图文 Intellij Idea作为一款编程工具 自从尝到它的强大功能带来的甜头后 就再也不想用Eclipse来进行开发了 下面用它来演示一下
  • 异常处理使代码更稳健的案例

    package Java project 1 import java util Scanner public class Test public static void main String args Scanner sc new Sca
  • ubuntu 18.04 搭建 fisco bcos 联盟链2.8版本(一)

    安装centos依赖 sudo apt install y openssl curl 创建操作目录 下载安装脚本 可将下载脚本和更改权限分开执行 创建操作目录 cd mkdir p fisco cd fisco 下载脚本 curl LO h
  • 玩转科技

    目录 前言 特性 编辑 为什么需要 ChatBox ChatGPT Plus 平替 下载 支持系统 功能图 使用教程 感受 展示 前言 今天小编又来了 推荐给大家一款开源的OpenAI API桌面客户端ChatBox 它支持 Windows
  • guava之Immutable(不可变)集合

    一 概述 guava是google的一个库 弥补了java语言的很多方面的不足 很多在java8中已有实现 暂时不展开 Collections是jdk提供的一个工具类 Guava中不可变对象和Collections工具类的unmodifia