Multiset之前倒是没用过,后来看了下还挺有用,其实它就是支持重复元素的HashSet,相当于list+set的集合,综合了两种集合的优点。

它扩展了Collection:

@GwtCompatible
public interface Multiset<E> extends Collection<E> {}

先用一下看看:

List<String> list = Lists.newArrayList("10", "20", "hello", "hah", "hah", "hah");
Multiset<String> set = HashMultiset.create(list);
System.out.println(set.contains("hello"));
System.out.println(set.count("hah"));
System.out.println(set.count("haha"));
System.out.println(set.elementSet().toString()+set.entrySet().toString());
true 3 0 [hello, 20, 10, hah][hello, 20, 10, hah x 3]
 

其实它和list很像,支持一个叫做count计数的方法,直接拿elementSet()的时候它会提供唯一的元素列表。使用它的entrySet会有一个唯一元素+计数的输出。

我们看下它的继承和实现体系:

其实它继承了AbstractMapBasedMultiset,然后AbstractMapBasedMultiset又继承了AbstractMultiset,然后又实现了Multiset的接口,Multiset继承了Collection,然后在Multiset对象中有一个count的计数,当有元素进入和输出的时候会有计数器的处理。

其实AbstractMapBasedMultiset就是一个key+count的map,这下就容易理解了。其实HashMultiSet就是对一个map进行了继承和覆盖,然后方法去操作一些唯一元素的计数与处理,但是又可以不丢失元素,还加快了get的获得速度。

至于这个Set的其实工具类应该和之前看的没有大的异同,暂时就不深入看了,接下来去看下MultiMap。

Guava包学习--Multiset的更多相关文章

  1. Guava包学习---Lists

    Guava包是我最近项目中同事推荐使用的,是google推出的库.里面的功能非常多,包括了集合.缓存.原生类型支持.并发库.通用注解.字符串处理.IO等.我们项目中使用到了guava依赖,但是实际上只 ...

  2. Guava包学习--EventBus

    之前没用过这个EventBus,然后看了一下EventBus的源码也没看明白,(-__-)b.反正大概就是弄一个优雅的方式实现了观察者模式吧.慢慢深入学习一下. 观察者模式其实就是生产者消费者的一个变 ...

  3. Guava包学习-Cache

    这段时间用到了ehcache和memcache,memcache只用来配置在tomcat中做负载均衡过程中的session共享,然后ehcache用来存放需要的程序中缓存. Guava中的Cache和 ...

  4. Guava包学习-Multimap

    它和上一章的MultiSet的继承结果很相似,只不过在上层的接口是Multimap不是Multiset. Multimap的特点其实就是可以包含有几个重复Key的value,你可以put进入多个不同v ...

  5. Guava包学习---Maps

    Maps包方法列表: 还是泛型创建Map: public static <K, V> HashMap<K, V> newHashMap() { return new HashM ...

  6. Guava包学习--Hash

    我们HashMap会有一个rehash的过程,为什么呢?因为java内建的散列码被限制为32位,而且没有分离散列算法和所作用的数据,所以替代算法比较难做.我们使用HashMap的时候它自身有一个reh ...

  7. Guava包学习---I/O

    Guava的I/O平时使用不太多,目前项目原因导致基本上只有在自己写一些文本处理小工具才用得到.但是I/O始终是程序猿最常遇到的需求和面试必问的知识点之一.同时Guava的I/O主要面向是时JDK5和 ...

  8. Guava包学习---Bimap

    Bimap也是Guava中提供的新集合类,别名叫做双向map,就是key->value,value->key,也就是你可以通过key定位value,也可以用value定位key. 这个场景 ...

  9. Guava包学习---Sets

    Sets包的内容和上一篇中的Lists没有什么大的区别,里面有些细节可以看一下: 开始的创建newHashSet()的各个重载方法.newConcurrentHashSet()的重载方法.newTre ...

随机推荐

  1. SQL Serever学习16——索引,触发器,数据库维护

    sqlserver2014数据库应用技术 <清华大学出版社> 索引 这是一个很重要的概念,我们知道数据在计算机中其实是分页存储的,就像是单词存在字典中一样 数据库索引可以帮助我们快速定位数 ...

  2. 关于C#委托和Lambda表达式

    关于C#委托和Lambda表达式 1.C#委托和Lambda表达式结合定义方法非常方便 在定一次性方法有很好的应用 delegate void getProductNoReturn(int a); d ...

  3. uestc Another LCIS

    Another LCIS Time Limit: 1000 ms Memory Limit: 65536 kB Solved: 193 Tried: 2428 Description For a se ...

  4. 小工具-IP地址获取和设置及端口访问验证(windows)

    技术部在业务部门眼里就是后勤部门,业务部门要搬到新大楼去 领导要求去帮忙调试业务人员的电脑,要保证这些大爷们周一上班来,就喝着茶打开新浪,然后打开OA看看. 手上就几个桌面支持的兄弟,要弄一百台多电脑 ...

  5. python学习之老男孩python全栈第九期_day026知识点总结——封装、property、类方法、初识反射

    一. 封装 class Room: def __init__(self, name, length, width): self.__name = name self.__length = length ...

  6. js在ie6下的一个bug—未结束标签的错误

    在IE6下,如果在body标签没结束前,用代码获取body对象就会出现错误.如: <html> <head> <script type="text/javasc ...

  7. css 动画中 ease,seae-in,ease-in-out,ease-out,效果区别

    linear 规定以相同速度开始至结束的过渡效果(等于 cubic-bezier(0,0,1,1)).(匀速) ease 规定慢速开始,然后变快,然后慢速结束的过渡效果(cubic-bezier(0. ...

  8. js中作用域链和作用域

    作用域 在JavaScript中,我们可以将作用域定义为一套规则,这套规则用来管理引擎如何在当前作用域以及嵌套的子作用域中根据标识符名称(变量名或者函数名)进行变量查找. 经过研究<高级程序设计 ...

  9. mybatis 关联表心得

    1,例如订单表与用户表的关联,一个订单对应一个用户,这是一对一关联: 用代码实现是这样: A(用resultType去实现的话,如下) 1,使用到继承, OrderUser extend Order{ ...

  10. java indexOf 和 split的用法

    1.java 的 indexOf 方法 ,如果存在 则 指定的字符串的开始位置,如果不存在 则返回-1: 2.java 的 split的方法:将一个字符串分割为子字符串,然后将结果作为字符串数组返回. ...