谷歌guava_使用Google Guava进行馆藏创建和不变性
谷歌guava
因此,我想看看番石榴提供的一些集合创建模式,以及它提供的某些不可变集合类型。
如果您没有看过我以前的文章,则可能要从这里开始:
番石榴第1部分– MultiMaps
番石榴第2部分– BiMaps
番石榴第3部分–多组
Guava的所有集合实现均包含一个或多个静态create
方法,这些方法可以实现您所期望的,并且通常提供一种更为简洁的实例化集合类的方法。 这是创建ArrayListMultimap的两种不同方法
Multimap<String,String> multimap1 = new ArrayListMultimap<String,String>();Multimap<String,String> multimap2 = ArrayListMultimap.create();
好的,因此其中没有太多内容(在此示例中为12个字符),但是从我的角度来看,您正在删除一些冗余,我们真的需要两次重现泛型类型信息吗?
很好,很遗憾,Sun没想到在创建Java 5时向其Collection类型添加create方法!
同样,番石榴在这里为您提供帮助,并提供了一些用于处理标准集合类型的实用程序类。 com.google.common.collect.Lists , com.google.common.collect.Sets和com.google.common.collect.Maps
它们每个都提供几种格式为new CollectionType ()
,下面是一些示例
List<String> myList1 = new ArrayList<String>(); //old wayList<String> myList2 = Lists.newArrayList(); //guava waySet<String> mySet1 = new HashSet<String>(); //old waySet<String> mySet2 = Sets.newHashSet(); //guava way
由于“ new”方法是静态的,因此您可以通过使用静态导入来剪切出更多字符,即…
import static com.google.common.collect.Lists.newArrayList;import static com.google.common.collect.Sets.newHashSet;//elsewhere in codeList<String> myList2 = newArrayList();Set<String> mySet2 = newHashSet();
明智的按键方式是,使用番石榴方法并不能真正节省很多,因此我想这和其他任何东西都一样。 我个人认为,番石榴的方法读起来要好得多,尽管我认为我不会使用静态导入。
到目前为止,还不错,但是几乎没有发生大的崩溃,接下来该怎么办?
不变的收藏
这些本质上是集合对象,创建后就无法更改,并且出于各种原因很有用。 Guava为大多数常规Collection接口提供了Immutable实现: ImmutableList , ImmutableSet和ImmutableMap ,以及某些Guava集合接口( ImmutableMultimap等)的不可变实现。
我对它们的主要用途是创建静态常量。 例如,假设您出于某种目的需要对一组字符串进行硬编码。
一种做到这一点的方法可能是,例如。
private static final Set<String> farmAnimals =new HashSet<String>(Arrays.asList('Cow','Pig','Sheep'));
它看起来并不好,并且存在一个主要问题。 可以访问此Set的任何代码也可以对其进行更改,这可能导致各种意外问题。
我们不能只使用Collection.unmodifiableSet(Set s)
来解决这个问题吗?
好吧,在这个特定的例子中,我想我们可以写……
private static final Set<String> farmAnimals =Collections.unmodifiableSet(new HashSet<String>(Arrays.asList('Cow','Pig','Sheep')));
…但是这开始显得有些笨拙,而且unmodifiable
方法还有另一个问题。 它们仅返回集合的不可修改视图,如果您引用原始集合,则仍然可以对其进行更改!
尽管在上一个示例中这可能不是问题,但我仍然认为更好的方法是使用ImmutableSet
private static final Set<String> farmAnimals = ImmutableSet.of('Cow','Pig','Sheep');
那就更好了! 还有其他几种创建它们的方法,下面是一些示例:
// use copyOf()...public void doStuffWithList(List<Object> unsafeList) {List<Object> safeList = ImmutableList.copyOf(unsafeList);}
// use a builder...public Map<String,Integer> makeImmutableMap() {ImmutableMap.Builder<String,Integer> mapBuilder = new ImmutableMap.Builder<String,Integer>();Entry<String,Integer> entry = null;while((entry = getEntry()) != null) {mapBuilder.put(entry.getKey(), entry.getValue());}return builder.build();}
那么,使用不可变集合还有其他优势吗?
好吧,有几个。 它们可以大大简化逻辑,尤其是在多线程环境中。 如果线程仅对对象具有读访问权限,则无需担心复杂的线程同步逻辑
创建它们后,它们的使用效率也略有提高。 如果一个集合事先知道它需要存储什么,并且永远不会有任何变化,则可以节省各种时间和空间。 例如,大多数ArrayLists或HashMaps的实现都会为新对象留下一些未使用的空间,因此它们不必不断调整自身大小。 如果您知道永远不会有任何新对象,则无需这样做。
最后,您还可以将它们用作哈希键。 如果集合的内容不能更改,那么它的哈希码也不会改变!
有什么缺点吗?
当然,不可变对象有一个很大的缺点,这很明显。 您无法更改它们! 如果您需要更改收藏集,则首先需要复制一份。 在某些情况下(例如,并发性很重要),您实际上可能希望采用这种方法。 但是,在集合包含许多对象的情况下这将是不切实际的,并且您可能需要一个老式的可变集合(如果需要,请提供同步代码)。
唯一需要注意的另一件事是,仅仅因为您的集合是不可变的,并不意味着它们中包含的对象是自动的。 如果您可以在不可变集合中获得对对象的引用,那么没有什么可以阻止您更改该对象上的任何可变状态! 因此,最佳做法是确保您保存在不可变集合中的任何内容本身都是不可变的!
参考: Tom's Programming Blog博客上的JCG合作伙伴 Tom Jefferys 提供了Google Guava的集合创建和不变性 。
翻译自: https://www.javacodegeeks.com/2012/12/collection-creation-and-immutability-with-google-guava.html
谷歌guava
谷歌guava_使用Google Guava进行馆藏创建和不变性相关推荐
- guava_使用Google Guava Cache进行本地缓存
guava 很多时候,我们将不得不从数据库或另一个Web服务获取数据或从文件系统加载数据. 在涉及网络呼叫的情况下,将存在固有的网络延迟,网络带宽限制. 解决此问题的方法之一是在应用程序本地拥有一个缓 ...
- java工具谷歌工具-Google guava工具类的介绍和使用
工具类 就是封装平常用的方法,不需要你重复造轮子,节省开发人员时间,提高工作效率.谷歌作为大公司,当然会从日常的工作中提取中很多高效率的方法出来.所以就诞生了guava. guava的优点: 高效设计 ...
- Java内存缓存-通过Google Guava创建缓存
谷歌Guava缓存 Guava介绍 Guava是Google guava中的一个内存缓存模块,用于将数据缓存到JVM内存中.实际项目开发中经常将一些公共或者常用的数据缓存起来方便快速访问. Guava ...
- 使用Google Guava创建收藏和实现不变性
因此,我想看看番石榴提供的一些集合创建模式,以及它提供的某些不可变集合类型. 如果您没有看过我以前的文章,则可能要从这里开始: 番石榴第1部分– MultiMaps 番石榴第2部分– BiMaps 番 ...
- 正则表达式 guava_带有正则表达式模式的Google Guava Cache
正则表达式 guava 最近我看到了一个关于Google Guava的不错的介绍 ,我们在我们的项目中得出结论,使用它的缓存功能真的很有趣. 让我们看一下regexp Pattern类及其编译功能 . ...
- Google Guava v07范例
我们在TouK举办了一个名为"每周技术研讨会"的活动,即每个星期五的16:00,每个愿意参加的人都有一个演讲. 我们展示了我们在家学习和学习的东西,但是我们也设有一个公告板,上面有 ...
- 一篇让你熟练掌握Google Guava包(全网最全)
Google Guava guava开源库的地址:https://github.com/google/guava 概述 工具类 就是封装平常用的方法,不需要你重复造轮子,节省开发人员时间,提高工作效率 ...
- Google guava 事件总线 EventBus 进程内消息队列
Google guava 事件总线 EventBus 创建事件总线流程 码代码 引入依赖 一个简单的事件处理 监听者 创建事件生产者总线.注册事件监听者.发送事件 运行结果 扩展 多个事件监听者加De ...
- Java类库Google Guava学习
参考 官网 https://github.com/google/guava Google Guava官方教程(中文版) | 并发编程网 – ifeve.com 一篇让你熟练掌握Google Guava ...
最新文章
- Nat. Biotechnol.扩增子测序革命—用16S及18S rRNA全长进行微生物多样性研究
- c#怎么读htm文件_c#怎么读写文件和获取文件的扩展名
- 使用cdn和npm引入的区别_在npm上发布自己的vue组件库(使用npm install 或者 CDN的方式引用)...
- ssl1236-逃亡准备【dp之多重背包】
- Java集合框架源码剖析:LinkedHashSet 和 LinkedHashMap
- sq语句报错Parameter index out of range (2 > number of parameters, which is 1).
- 前端学习(1851)vue之电商管理系统电商系统配置ssh
- 第一周:深度学习引言(Introduction to Deep Learning)
- 双引擎驱动Quick BI十亿数据0.3秒分析,首屏展示时间缩短30%
- 技术实践第四期|解读移动开发者日常-性能监控平台应用
- dbnetlib sqlserver不存在或拒绝访问_404:对不起,您访问的网页不存在
- 【2018.10.2】Note of CXM
- UML类图中会涉及到的一些概念、关系
- LeetCode -- 推断链表中是否有环
- C语言实现推箱子game
- java word转pdf_Java中Word转PDF解决方案
- android 哈哈镜,Carnival Mirror App(哈哈镜模拟器)
- 项目合同管理 试题分析
- STM32F103 实现 简易闹钟小程序
- Fedora 使用 yaourt