Google guava 集合的创建特性和只读特性
现在,让我们一起看看guava集合的创建模式,再看看guava提供的一些只读的集合类型。
如果你还不了解guava集合,那么可以参考我之前写的文档:
Guava集合1:MultiMap
http://vipcowrie.iteye.com/blog/1517338
Guava集合2:BiMap
http://vipcowrie.iteye.com/blog/1521092
Guava集合3:MultiSet
http://vipcowrie.iteye.com/blog/1517196
创建方法:
所有的Guava的集合实现都包含一些静态的创建方法,这些方法执行你期望的操作,并且也提供一些更加准确的创建方法。
这里演示两种创建ArrayListMultimap的方法:
Multimap<String,String> multimap1 = new ArrayListMultimap<String,String>();
Multimap<String,String> multimap2 = ArrayListMultimap.create();
第一种方法看起来很臃肿,因为我们写了两遍泛型的定义,不烦么?JDK没有提供类似的方法,即定义集合的时候必须写两遍泛型定义的问题SUN公司没有考虑到。
Google guava提供了补救的方法,com.google.common.collect.Lists(Sets,Maps)提供了一些静态的方法供程序员便捷的创建JDK的集合类,一般此类方法的
命名规则就是:xxx.newXxxtype(),下面是一些例子:
List<String> myList1 = new ArrayList<String>(); //old way
List<String> myList2 = Lists.newArrayList(); //guava way
Set<String> mySet1 = new HashSet<String>(); //old way
Set<String> mySet2 = Sets.newHashSet(); //guava way
因为newXxx方法都是静态的,所以可以通过static import的方式更加简化,例如:
import static com.google.common.collect.Lists.newArrayList;
import static com.google.common.collect.Sets.newHashSet;
//elsewhere in code
List<String> myList2 = newArrayList();
Set<String> mySet2 = newHashSet();
静态引用虽然简单,但是不推荐使用,因为别人读起来可能比较麻烦。好,下面介绍一下只读的集合。
所谓只读的集合,就是那些一旦创建就不能修改的集合,这个在某些场景下可能很有用。Guava为大多数的集合接口提供只读的实现,例如:ImmutableList,ImmutableSet和ImmutableMap等等。这里我举一个定义常量的例子,例如:
private static final Set<String> farmAnimals = new HashSet<String>(Arrays.asList("Cow","Pig","Sheep"));
看起来很复杂是不是,这个集合有一个问题,虽然是final的,但是里面的元素还是可能被修改的,这可能带来很多问题。jdk的集合有一个方法:Collection.unmodifiableSet(Set s),是否可以用这个方法解决问题呢:
private static final Set<String> farmAnimals = Collections.unmodifiableSet(new HashSet<String>(Arrays.asList("Cow","Pig","Sheep")));
这个能确实达到效果,即不可修改farmAnimals的元素,但是有两个问题,一个是这个创建代码太长,另外一个就是Collections.unmodifiableSet实际上是返回了一个只读的视图,如果有其他对象持有内部的hashset的引用,那么一样可以修改里面的元素。所以,还有一个更好的办法:
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();
}
还有很多方法。这个只读的集合在多线程的环境中很有用,因为这样就不用考虑使用同步机制来保证集合的完整性了。
但是只读的集合也有劣势,包括:
1)只读:只读本身就是一个劣势,如果你希望后面再修改的话,只能再创建一个集合的拷贝了
2)仍然可能被修改:集合的对象虽然不能被增删,但是对象本身如果有的属性可以修改,那么对象也可以直接被引用者修改,所以,你如果真的要一个只读集合的话,那么请你确保里面的对象也是只读的。
分享到:
相关推荐
赠送jar包:guava-11.0.2.jar; 赠送原API文档:guava-11.0.2-javadoc.jar; 赠送源代码:guava-11.0.2-sources.jar; 赠送Maven依赖信息文件:guava-11.0.2.pom; 包含翻译后的API文档:guava-11.0.2-javadoc-API...
赠送jar包:guava-23.0.jar; 赠送原API文档:guava-23.0-javadoc.jar; 赠送源代码:guava-23.0-sources.jar; 赠送Maven依赖信息文件:guava-23.0.pom; 包含翻译后的API文档:guava-23.0-javadoc-API文档-中文...
赠送jar包:guava-18.0.jar 赠送原API文档:guava-18.0-javadoc.jar 赠送源代码:guava-18.0-sources.jar 包含翻译后的API文档:guava-18.0-javadoc-API文档-中文(简体)-英语-对照版.zip 对应Maven信息:groupId...
Guava的核心特性包括集合框架、缓存、原生类型支持、并发库、字符串处理、I/O操作等。这个“guava.jar”文件就是包含了所有这些功能的归档包。 Guava的集合框架扩展了Java内置的集合类,如List、Set和Map,提供了更...
赠送jar包:guava-24.1-jre.jar; 赠送原API文档:guava-24.1-jre-javadoc.jar; 赠送源代码:guava-24.1-jre-sources.jar; 赠送Maven依赖信息文件:guava-24.1-jre.pom; 包含翻译后的API文档:guava-24.1-jre-...
`guava-18.0.jar`是Guava库的编译后的二进制版本,包含了所有Guava类和方法的字节码,开发者可以直接在项目中引用这个JAR文件来使用Guava的功能。Guava 18.0版本包含了大量实用工具,例如: 1. **集合框架扩展**:...
赠送jar包:guava-26.0-android.jar; 赠送原API文档:guava-26.0-android-javadoc.jar; 赠送源代码:guava-26.0-android-sources.jar; 赠送Maven依赖信息文件:guava-26.0-android.pom; 包含翻译后的API文档:...
这个版本的Guava提供了如ListMultimap、Table、Optional等数据结构,以及Preconditions、CheckState等代码质量检查工具,还有诸如FluentIterable、Iterables、Collections2等增强的集合操作方法。此外,它还包含了对...
Guava 是一个 Google 的基于java1.6的类库集合的扩展项目,包括 collections, caching, primitives support, concurrency libraries, common annotations, string processing, I/O, 等等. 这些高质量的 API 可以使你...
Guava是Google开发的一个Java库,它包含许多Google核心库中的高级集合、缓存、原生类型支持、并发包、字符串处理、I/O等工具类。版本33.0.0是Guava的一个更新,提供了最新的功能改进和错误修复。在深入探讨Guava常用...
Guava是Google开发的一个开源Java库,包含了众多的实用工具类和集合框架,极大地提高了Java开发的效率。在本例中,我们关注的是"guava-30.1-jre.jar",这是一个针对Java运行环境(JRE)优化的Guava版本,版本号为...
赠送jar包:guava-18.0.jar; 赠送原API文档:guava-18.0-javadoc.jar; 赠送源代码:guava-18.0-sources.jar; 包含翻译后的API文档:guava-18.0-javadoc-API文档-中文(简体)版.zip 对应Maven信息:groupId:...
赠送jar包:guava-20.0.jar; 赠送原API文档:guava-20.0-javadoc.jar; 赠送源代码:guava-20.0-sources.jar; 赠送Maven依赖信息文件:guava-20.0.pom; 包含翻译后的API文档:guava-20.0-javadoc-API文档-中文...
google的guava工具包很实用,包括之前的字符串处理工具类的,还有大量的collection相关的
Guava是Google推出的一个强大的Java工具包,其中的Multiset、Multimap和GroupingBy等功能提供了高级的集合操作,特别是对于集合的分组功能,它提供了一种高效且灵活的方式。 首先,我们需要理解Guava中的`...
guava
最新版 guava-30.1-jre.jar
赠送jar包:guava-17.0.jar; 赠送原API文档:guava-17.0-javadoc.jar; 赠送源代码:guava-17.0-sources.jar; 赠送Maven依赖信息文件:guava-17.0.pom; 包含翻译后的API文档:guava-17.0-javadoc-API文档-中文...
4. **并发工具**:Guava提供了如Lists.newArrayList、Sets.newHashSet等线程安全的构造方法,以及CountDownLatch、CyclicBarrier、Semaphore等并发控制工具。 5. **字符串处理**:Guava的Strings类提供了许多便捷的...
Google Guava 是一个广泛使用的开源库,为Java开发人员提供了一系列实用工具类和集合框架。这个库旨在简化常见的编程任务,提高代码的可读性和可维护性。Guava 提供了丰富的功能,包括缓存、并发工具、原生类型支持...