文档章节

Guava集合-不可变集合

Kevin-air
 Kevin-air
发布于 2016/08/04 16:54
字数 514
阅读 19
收藏 2

JDK的Collections.unmodifiableXXX方法实现不可变集合的一些问题:

  1.它用起来笨拙繁琐你不得不在每个防御性编程拷贝的地方用这个方法
  2.它不安全:如果有对象reference原始的被封装的集合类,这些方法返回的集合也就不是正真的不可改变。
  3.效率低:因为它返回的数据结构本质仍旧是原来的集合类,所以它的操作开销,包括并发下修改检查,hash table里的额外数据空间都和原来的集合是一样的。

Immutable集合使用方法:
  一个immutable集合可以有以下几种方式来创建:
  1.用copyOf方法, 譬如, ImmutableSet.copyOf(set)
  2.使用of方法,譬如,ImmutableSet.of("a", "b", "c")或者ImmutableMap.of("a", 1, "b", 2)
  3.使用Builder类

示例

import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.ImmutableSortedSet;
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;

/**
 * @author Kevin
 * @description
 * @date 2016/8/4
 */
public class ImmutableTest {

    @Test
    public void testGuavaImmutable() {

        List<String> list = new ArrayList<String>();
        list.add("a");
        list.add("b");
        list.add("c");
        System.out.println("list:" + list);

        // 1.copy方式
        ImmutableList<String> imlist = ImmutableList.copyOf(list);
        System.out.println("imlist:" + imlist);

        // 2.of方式
        ImmutableList<String> imOflist = ImmutableList.of("Kevin", "Chris", "Han");
        System.out.println("imOflist:" + imOflist);

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

        list.add("baby");
        System.out.println("list add a item after list:" + list);
        System.out.println("list add a item after imlist:" + imlist);

        // 3.builder方式
        ImmutableSet<String> imColorSet =
                ImmutableSet.<String>builder()
                        .add("Kevin")
                        .add("Han")
                        .build();

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

    @Test
    public void testCotyOf() {
        ImmutableSet<String> imSet = ImmutableSet.of("Kevin", "Chris", "Han", "Herry");
        System.out.println("imSet:" + imSet);
        ImmutableList<String> imlist = ImmutableList.copyOf(imSet);
        System.out.println("imlist:" + imlist);
        ImmutableSortedSet<String> imSortSet = ImmutableSortedSet.copyOf(imSet);
        System.out.println("imSortSet:" + imSortSet);

        List<String> list = new ArrayList<String>();
        for (int i = 0; i < 20; i++) {
            list.add(i + "x");
        }
        System.out.println("list:" + list);
        ImmutableList<String> imInfolist = ImmutableList.copyOf(list.subList(2, 18));
        System.out.println("imInfolist:" + imInfolist);
        int imInfolistSize = imInfolist.size();
        System.out.println("imInfolistSize:" + imInfolistSize);
        ImmutableSet<String> imInfoSet = ImmutableSet.copyOf(imInfolist.subList(2, imInfolistSize - 3));
        System.out.println("imInfoSet:" + imInfoSet);
    }

    @Test
    public void testAsList() {
        ImmutableList<String> imList = ImmutableList.of("Kevin", "Chris", "Han", "Herry");
        System.out.println("imList:" + imList);
        ImmutableSortedSet<String> imSortList = ImmutableSortedSet.copyOf(imList);
        System.out.println("imSortList:" + imSortList);
        System.out.println("imSortList as list:" + imSortList.asList());
    }
}

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

© 著作权归作者所有

共有 人打赏支持
Kevin-air
粉丝 14
博文 73
码字总数 26587
作品 0
深圳
私信 提问
【java代码之美】---guava之Immutable(不可变)集合

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

雨点的名字
2018/08/02
0
0
Guava学习笔记:Immutable(不可变)集合

  不可变集合,顾名思义就是说集合是不可被修改的。集合的数据项是在创建的时候提供,并且在整个生命周期中都不可改变。   为什么要用immutable对象?immutable对象有以下的优点:    ...

pior
2015/03/31
0
0
Java不可变ArrayList

集合类在Java中是引用类型,在操作的时候可能不经意间被程序修改,一些初级开发经常会犯类似的错误。这里我们讨论下如何让ArrayList不可改变。本文将演示以下几种方式: JDK Guava Apache C...

艾贺
2018/09/18
0
0
Guava学习笔记 第6个记录(Immutable(不可变)集合)

不可变集合,顾名思义就是说集合是不可被修改的。集合的数据项是在创建的时候提供,并且在整个生命周期中都不可改变。 为什么要用immutable对象?immutable对象有以下的优点: 1.对不可靠的客...

heroShane
2014/02/13
0
0
java中Final关键字和Immutable Class以及Guava的不可变对象

大纲 写这篇文章的起因 java中Final关键字 如何构建不可变对象 Guava中不可变对象和Collections工具类的unmodifiableSet/List/Map/etc的区别 实验代码 写这篇文章的起因 java项目在使用FindB...

敲代码猥琐男
2015/09/23
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

VMware下centos7.x 用yum快速搭建LAMP平台

实验环境: [root@nmserver-7 html]# cat /etc/redhat-release CentOS release 7.3.1611 (AltArch) [root@nmserver-7 html]# uname -aLinux nmserver-7.test.com 3.10.0-514.el7.cent......

皇冠小丑
50分钟前
1
0
搜索引擎(Solr-索引详解)

时间字段类型特别说明 Solr中提供的时间字段类型( DatePointField, DateRangeField,废除的TrieDateField )是以时间毫秒数来存储时间的。 要求字段值以ISO-8601标准格式来表示时间:YYYY-MM...

这很耳东先生
今天
5
0
Java成神之路

1、基础篇 01、面向对象 → 什么是面向对象 面向对象、面向过程 面向对象的三大基本特征和五大基本原则 → 平台无关性 Java 如何实现的平台无关 JVM 还支持哪些语言(Kotlin、Groovy、JRuby...

asdf08442a
今天
3
0
dubbo源码分析-服务导出

简介 dubbo框架spring Schema扩展机制与Spring集成,在spring初始化时候加载dubbo的配置类。 dubbo服务导出的入口类是ServiceBean的onApplicationEvent方法 ServiceBean的继承关系如下 publ...

王桥修道院副院长
今天
2
0
QQ音乐的动效歌词是如何实践的?

本文由云+社区发表 作者:QQ音乐技术团队 一、 背景 1. 现状 歌词浏览已经成为音乐app的标配,展示和动画效果也基本上大同小异,主要是单行的逐字染色的卡拉OK效果和多行的滚动效果。当然,我...

腾讯云加社区
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部