番石榴或其他地方有IdentitySetMultimap吗?

Is there IdentitySetMultimap in guava or somewhere else?

Java 提供了 IdentityHashMap,当您想通过 == 而不是 equals 方法比较对象时,这是完美的选择。

Guava 为 Map<Key, Set<Value> 提供了很好的包装器,即 SetMultimap。但是,没有使用标识对象比较 (==) 的实现。

有什么比普通的更好 IdentityHashMap<Key, IdentityHashSet<Value>>? 一些IdentitySetMultimap<Key, Value> 是理想的。

Guava 没有 IdentitySetMultimap。我们通常建议您按照您的建议进行操作,或者创建一个 SetMultimap<Equivalence.Wrapper<Key>, Equivalence.Wrapper<Value>>。您将使用 <a href="http://google.github.io/guava/releases/19.0/api/docs/com/google/common/base/Equivalence.html#identity()" rel="nofollow noreferrer">Equivalence.identity()</a>.<a href="http://google.github.io/guava/releases/19.0/api/docs/com/google/common/base/Equivalence.html#wrap(S)" rel="nofollow noreferrer">wrap(...)</a> 在 querying/modifying 集合之前包装您的键和值。

(更新:您可以从 中看到还有另一种方法可以做到这一点。)

您可以使用 Multimaps.newSetMultimap(Map, Supplier) with Maps.newIdentityHashMap() and Sets.newIdentityHashSet():

public static <K, V> SetMultimap<K, V> newIdentitySetMultimap() {
    return Multimaps.newSetMultimap(Maps.newIdentityHashMap(), Sets::newIdentityHashSet);
}

这还使您能够通过指定不同的映射或集合实现来仅对键或值使用身份比较。上面的示例将对两者使用身份比较。

使用 Eclipse Collections,您目前可以为值设置标识,但不能为键设置标识映射(截至今天)。如果您只需要为值设置标识,则以下方法可行。

MutableSetMultimap<String, String> multimap =
    UnifiedSetWithHashingStrategyMultimap.newMultimap(
        HashingStrategies.identityStrategy());
multimap.put("a", "a");
multimap.put("a", new String("a"));
multimap.put("a", new String("a"));

Assert.assertEquals(3, multimap.get("a").size());

您还可以定义自己的 HashingStrategy 实现以与 UnifiedSetWithHashingStrategyMultimap 一起使用。

注意:我是 Eclipse Collections 的提交者。