1.概述

在本教程中,我们将探索其中一个郭瓦收藏 -多车。像一个java.util.set.,它允许在没有保证订单的情况下高效存储和检索物品。

但是,与a不同,它允许多个相同元素的发生通过跟踪它包含的每个唯一元素的计数。

2. Maven依赖

首先,让我们添加郭瓦依赖性

<依赖>  com.google.guava   GUAVA   29.0-JRE  

3.使用多车

让我们考虑一个有多个不同书籍副本的书店。我们可能希望执行添加副本,如添加副本,获取份数,并在销售时删除一个副本。作为一个不允许多个相同元素出现,无法处理此要求。

让我们开始加入一张书籍标题的副本。这多车应该返回标题是否存在并为我们提供正确的计数

MultiSet  Bookstore = hashmultiset.Create();Bookstore.add(“Potter”);Bookstore.add(“Potter”);Bookstore.add(“Potter”);Assertthat(书店。索引(“Potter”))。Istrue();assertthat(书店.Count(“Potter”))。Isequalto(3);

现在让我们删除一个副本。我们预计算数会相应更新:

Bookstore.remove(“Potter”);Assertthat(书店。索引(“Potter”))。Istrue();Assertthat(书店.Count(“Potter”))。isequalto(2);

实际上,我们可以设置计数而不是执行各种添加操作:

Bookstore.SetCount(“Potter”,50);Assertthat(书店。(“Potter”))。Isequalto(50);

多车验证数数价值。如果我们将它设置为负面,一个IllegalArgumentException.被抛出:

assertthatthrownby(() - > bookstore.setcount(“potter”,-1)).isinstanceof(IllegalArgumentException.class);

4.与之比较地图

没有访问多车,我们可以通过实施自己的逻辑来实现上面的所有操作java.util.map:

地图 bookstore = new hashmap <>();//添加3个副本书店.put(“Potter”,3);Assertthat(书店.Containskey(“Potter”))。Istrue();Assertthat(书店。(“Potter”))。isequalto(3);//删除1副本书店.put(“Potter”,2);assertthat(书店。(“Potter”))。isequalto(2);

当我们想使用a添加或删除副本时地图,我们需要记住当前的计数并相应调整。我们还需要在我们的呼叫代码中实施此逻辑,或为此目的构建自己的库。我们的代码还需要控制价值争论。如果我们不小心,我们可以轻松地将值设置为空值或者,即使两个值无效,也是负的:

Bookstore.put(“Potter”,null);Assertthat(书店.Containskey(“Potter”))。Istrue();Bookstore.put(“Potter”,-1);Assertthat(书店.Containskey(“Potter”))。Istrue();

正如我们所看到的,使用更方便多车代替地图

5.并发

当我们想要使用时多车在并发环境中,我们可以使用Concurrenthashmultiset.,这是一个线程安全的多车执行。

不过,我们应该注意,线程安全不保证一致性。使用添加或者去掉方法在多线程环境中运行良好,但如果几个线程叫做什么setcount.方法?

如果我们使用setcount.方法,最终结果将取决于跨线程的执行顺序,这不一定会被预测。这添加去掉方法是增量的,而且Concurrenthashmultiset.能够保护他们的行为。直接设置计数不是增量,因此在同时使用时会导致意外结果。

但是,还有另一种味道setcount.仅当其当前值与传递的参数匹配时更新计数的方法。如果操作成功,该方法返回True,一种乐观锁定形式:

MultiSet  Bookstore = hashmultiset.Create();//如果当前计数为0 assertthat(bookstore.setcount(“potter”,0,2)),则更新计数到2。Istrue();//如果当前值为50 assertthat(bookstore.setcount(“potter”,50,5)),则更新计数到5。Isfalse();

如果我们想使用setcount.在并发代码中的方法,我们应该使用上述版本来保证一致性。如果更改计数失败,则多线程客户端可以执行重试。

六,结论

在这个简短的教程中,我们讨论了何时以及如何使用多车,与标准相比地图并查看在并发应用中的最佳用它。

一如既往,可以找到示例的源代码在github上

通用底部

使用Spring 5和Spring Boot 2开始,通过学习春天课程:

>>查看课程
评论在本文上关闭!