Java标准库是否缺少某种集合类型?
1、 Guava是一套由谷歌为自身Java项目开发的工具库,主要聚焦于集合操作、输入输出处理及数学运算,并与Apache Commons库有一定功能重叠。该库可视为对Java Collections API中数据结构的有效补充和扩展,提升了开发效率与代码简洁性。
2、 Guava引入了名为Multiset的集合类型,允许集合中存在多个相同元素。该类提供了统计某一元素出现次数的方法,并支持将Multiset转换为普通集合,便于在不同场景下灵活使用,增强了集合操作的便利性与功能性。
3、 类似于Collections库,提供了多种多集实现方式,包括HashMultiset、TreeMultiset以及ConcurrentHashMultiset,适用于不同场景下的集合操作需求。
4、 下图展示了当前应用的多重集合。
5、 这能够记录每个元素的出现总次数。将多重集合视为元素与对应计数之间的映射关系,有助于理解其原理。尽管可以通过映射结构实现类似功能,但Guava的实现更为强大:其size()方法返回的是所有元素的总数,而基于映射的实现仅返回不同元素的种类数。此外,映射的迭代器每种元素只遍历一次,无法反映实际重复数量,而Guava能更准确地体现多集特性。
6、 多目标映射允许多个键存在于同一映射中,类似多集映射的特性。
7、 当需要为键关联多个值时,通常采用键映射到值列表或集合的方式。添加值时,常会遇到类似如下伪代码的处理逻辑。
8、 这种方式较为脆弱且易出错,还需保证线程安全。使用Guava的Multimap可简化处理,更可靠高效。
9、 下图展示了其使用实例。
10、 get方法返回的是映射值类型的一个集合,而非单个实例对象。
11、 multiap与Java的Map接口存在几处差异:其get方法永不返回null,若键不存在则返回空集合;此外,size方法统计的是所有条目总数,而非仅键的数量。这些设计使得multiap在处理多值映射时更为直观和安全。
12、 类似于Multiset,可通过asMap方法将multiap转换为Java映射,结果是一个键与值集合的映射,即Map>,便于按键访问对应的多个值。
13、 Guava 提供的另一种映射类型是 BiMap 接口,它支持双向查找功能:既能通过键查找值,也能通过值反向查找对应的键。在 Java 中使用普通 Map 实现类似功能较为复杂,通常需要维护两个独立的映射结构,并严格保证任意值在整个映射中唯一,避免出现重复值导致的映射冲突问题。
14、 下图展示股票代码与对应公司名称的映射关系示例。
15、 inverse 引用了原始的 BiMap,因此在原始映射中新增的内容会同步到反向映射中,同样,反向映射的改动也会反映到原始映射里。
