Guava ImmutableCollection简介
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。
ImmutableCollection代码定义
@GwtCompatible(emulated=true)
public abstract class ImmutableCollection<E> extends AbstractCollection<E> implements Serializable
ImmutableCollection表示内容不可更改的集合,并提供以下额外特性的担保。
注意:应当避免直接使用ImmutableCollection作为一个类型,就如同避免直接使用Collection本身一样。最好使用其子类(例如ImmutableSet或ImmutableList),因为子类拥有更好的Object.equals(java.lang.Object) 语义,可以从源头避免常见的bug和错误。
以下文档适用于com.google.common.collect包中所有公开的不可变类型,不论是否是ImmutableCollection的子类。
保证特性
- 浅不可变:
浅不可变是指值是不可写的,但是如果是对象的引用的值是可被改变的。不能对不可变集合的元素进行增加、移除或者替换。这是比Collections.unmodifiableCollection 更严格的保证,因为这个集合的内容会随其包装集合的改变而改变。
- 不可为Null:
本集合不能包含null元素。
- 确定性的迭代 :
元素迭代顺序是被定义的,取决于集合的创建(细节可以参考对应的工厂方法)。除非另外注明,集合视图(例如ImmutableMultiset.elementSet())的迭代顺序与父集合一样。
- 线程安全:
多线程并发访问集合是安全的。
- 完整性:
本类型不能在除com.google.common.collect包以外被继承。(因为这有可能违反以上担保特性。)
接口而非实现
每一个公开的类(例如ImmutableSet)都是一个提供具体功能行为保证的类型,而不仅仅是在某种特定的实现(例如ArrayList)。对类型名称的含义都应当理解为是接口而非实现。
属性类型和方法返回类型通常都应当使用不可变类型(例如ImmutableList)而不是一般的集合接口(例如List)。这样便于告知调用者以上对于类型的保证特性,这是非常有用的信息。
另一方面,直接将ImmutableList作为参数类型并不令人满意。解决方案是接受Iterable类型参数,通过方法或构造器将它传递给相应的copyOf方法。
创建
除了逻辑层面的抽象类(例如ImmutableCollection),每个不可变类型都提供了或者此类型实例的静态方法。最常用的有:
1、静态方法of,接受一个显示的元素或条目列表。
2、静态方法copyOf(或者copyOfSorted),接受一个内容可被复制的已存在的集合。
3、嵌套的静态类Builder,它可以用来填充一个新的不可变实例。
警告
如任何集合一样,改变集合中的元素(这种改变影响了Object.equals(java.lang.Object)的行为)是一种错误的做法。他会引起未定义的行为和bug。通常最佳实践是完全避免使用可变对象作为集合元素,虽然许多用户认为不可变对象是深不可变的(deeply immutable)。
性能说明
1、集合的实现通常优先考虑内存效率,然后是访问速度,最后是创建速度。
2、copyOf方法有时会认为没有必要进行实际复制操作:例如,copyOf(copyOf(anArrayList))只会复制一次。这减少了在API边界习惯性地创建防御副本的代价。但是,跳过拷贝操作的精确情况是未定义的。
3、警告:视图集合(例如ImmutableMap.keySet或ImmutableList.subList(int,int))会保留对整个数据集合的引用,以防止其被垃圾收集。如果其中一些数据通过其他方式不再可用,这可能会产生内存泄漏。可通过传递视图集合给适当的copyOf方法以获得正确大小的拷贝。
4、与创建可变集合并拷贝相比,使用相应关联的Builder类并不会降低性能,有可能会更好。
5、通常实现不会缓存hash code。如果元素或键类型的hashCode实现较慢,它应当自己实现缓存。
使用示例
class Foo {private static final ImmutableSet<String> RESERVED_CODES =ImmutableSet.of("AZ", "CQ", "ZX");private final ImmutableSet<String> codes;public Foo(Iterable<String> codes) {this.codes = ImmutableSet.copyOf(codes);checkArgument(Collections.disjoint(this.codes, RESERVED_CODES));}}
Guava ImmutableCollection简介相关推荐
- [Guava源码日报(1)]Guava类库简介
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/SunnyYoona/article/details/50805613 1. 简介 Guava工程包含 ...
- Guava学习笔记:Google Guava 类库简介
Guava 是一个 Google 的基于java1.6的类库集合的扩展项目,包括 collections, caching, primitives support, concurrency libra ...
- Guava Futures异步回调机制源码解析
本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/51758194 1.前言 在前两篇文章中简单阐述了Java ...
- 多级缓存之Google Guava的实现方案
文章目录 背景 如何创建? pom引入依赖 CacheLoader方式 何时使用? 案例 CacheBuilder 的详细方法 Callable方式 何时使用? 案例 如何删除? 被动 基于数据大小的 ...
- Guava布隆过滤器(boomfilter)使用简介
1 布隆过滤器简介 布隆过滤器是一种空间利用率较高的概率型数据结构,用来测试一个元素是否在集合中.但是存在一定可能,导致结果误判.即元素不在集合中,查询结果却返回元素在集合中. 布隆过滤器一些的性质 ...
- [Java]-Guava工具库简介
文章目录 字符串 Jointer Splitter 拆分器工厂 拆分器修饰符 CharMatcher 工厂方法 操作方法 Strings 集合 不可变集合 新型集合 Multiset Multimap ...
- Google guava之ListMultimap简介说明
转自: Google guava之ListMultimap简介说明 下文笔者讲述guava中ListMultimap集合的简介说明,如下所示 guava之ListMultimap集合简介 ListMu ...
- [Guava源码日报](8)ImmutableCollection
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/SunnyYoona/article/details/71080164 不可变集合,顾名思义就是说集合 ...
- Guava简介(详细)
文章目录 前言 一.Guava的好处 : 二.guava高质量的 API : 1.项目相关信息 2.源码包的简单说明 3.类库使用手册 三. springBoot集成guava cache缓存 总结 ...
最新文章
- 《C++面向对象高效编程(第2版)》——导读
- wpf Command Binding
- [react] 你有使用过formik库吗?说说它的优缺点
- 史上首次无人车队集体婚礼,直男新郎给新娘の礼物:工业设计书
- Codeforces Beta Round #4 (Div. 2 Only) D. Mysterious Present(LIS)
- 使用Struts2和jQuery EasyUI实现简单CRUD系统(五)——jsp,json,EasyUI的结合
- 卡巴斯基授权文件获取网站
- java的方法分为两大类型,java题库
- 2021-10-22 学习笔记:和弦对照信息表
- python代码美化工具
- 小学计算机优秀说课稿ppt,【说课备考】各学科说课稿示范第7天 — 小学信息技术...
- 最小二乘法曲线拟合公式推导与代码实现
- 嵌入式系统的软件组成
- C语言之如何判断闰年:
- VC++6.0 Win32应用程序 如何添加窗体 ------阿冬专栏
- 关于微信开放平台授权事件接收Url的配置以及参数接收
- 【转载】Cygwin安装
- 如何承接软件外包项目
- android帧动画倒放,GIF动态图怎么倒放_倒放GIF动态图的简单方法介绍_3DM手游
- 游戏Tick时间轮算法实现
热门文章
- 【软技能】代码先放一放,学习一下工程的概念
- CCNP-第十一篇-BGP(三)(精髓篇)
- *【 POJ - 1007 】DNA Sorting(枚举,类似三元组找第二元问题)
- 【POJ - 2096】Collecting Bugs(概率dp)
- 【HDU - 5918 】Sequence I (数组(字符串)匹配问题,可选KMP)
- 【HDU - 3466 】Proud Merchants(dp,背包问题,巧妙排序)
- 计算机测试怎么提交,Win7电脑怎么测试上传速度?
- java向Excel文件写入数据
- java中br.readline_Java:java中BufferedReader的read()及readLine()方法的使用心得
- log nginx 客户端请求大小_nginx log记录请求响应时间