【问题标题】:What is difference between HashMap and HashMultimapHashMap 和 HashMultimap 有什么区别
【发布时间】:2013-10-13 20:39:16
【问题描述】:

我看到很多关于多地图的示例,但不明白为什么 Google Gauva 与众不同?

Multimap<Integer, Set<String>> option4 = HashMultimap.create(); // Gauva

Map<Integer, Set<String>> opt = new HashMap<Integer, Set<String>>(); //Core Java

以上两者对于保存数据的行为是相同的还是不同的?

【问题讨论】:

  • 阅读此Guava Wiki 页面。
  • 您的第一个定义不等同于第二个。第二个应该是Map&lt;Integer, Set&lt;Set&lt;String&gt;&gt;&gt;(我怀疑这是你需要的),或者第一个应该是Multimap&lt;Integer, String&gt;

标签: java collections guava


【解决方案1】:

A MultiMap&lt;A, B&gt; 将 A 类型的键与 Collection&lt;B&gt; 类型的值相关联(因此称为 MultiMap)

A Map&lt;A, B&gt; 将 A 类型的键与 B 类型的值相关联。

因此,MultiMap&lt;Integer, Set&lt;String&gt;&gt; 可以被视为Map&lt;Integer, Collection&lt;Set&lt;String&gt;&gt;。通过阅读the api documentation,这应该是显而易见的。

【讨论】:

  • 这很简单,因此很有帮助:)
【解决方案2】:

不同之处在于,对于第二种 Core Java 实现,您需要在插入之前检查 Set 是否存在。 Guava 的 Multimap 会为您解决这个问题。

使用核心 Java:

Set<String> innerSet = opt.get(key);
if (innerSet == null) {
    innerSet = new HashSet<String>();
    opt.put(key, innerSet);
}
innerSet.add(value);

使用番石榴:

opt.put(key, value);

Guava 负责初始化一个原本不存在的 Set 来存储值,负责处理任何线程问题(例如,阻止两个线程为同一个键并行创建一个新 Set),并且还提供了一些有用的方法,您可以d 否则需要手动实现,例如获取所有Sets 中的所有值。

【讨论】:

    【解决方案3】:

    你误会了什么。这些甚至不是大致相等的:

    Multimap<Integer, Set<String>> option4 = HashMultimap.create(); // Guava
    Map<Integer, Set<String>> opt = new HashMap<Integer, Set<String>>(); //Core Java
    

    在您的示例中,opt4 会将单个 Integer 映射到字符串集合的集合。 这正是使用Multimap 的意义所在,您不必显式处理第二个维度。所以事实上,正确的(等价的)声明应该是:

    SetMultimap<Integer, String> multimap = HashMultimap.create(); // Guava
    

    你可以得到这样的地图视图:

    Map<Integer, Set<String>> mapView = multimap.asMap();
    

    【讨论】:

      【解决方案4】:

      不,MultiMap 表示每个键都有一个对象集合。 Documentation: Multimap_Is_Not_A_Map

      【讨论】:

        【解决方案5】:

        首先 com.google.common.collect.Multimap 不是 java.util.Map,它在一个单独的层次结构中。

        其次,您可以使用 Map&lt;Integer, Set&lt;String&gt;&gt; 进行 Multimap 接口所需的所有操作,但您必须自己实现它们,而 HashMultimap 提供现成的实现。

        【讨论】:

          猜你喜欢
          • 2013-07-28
          • 2011-01-27
          • 2019-12-03
          • 2021-01-02
          • 1970-01-01
          • 1970-01-01
          • 2015-07-18
          • 1970-01-01
          • 2013-12-12
          相关资源
          最近更新 更多