216

我正在寻找 Java 中的双向地图实现,并偶然发现了这两个库:

两者都是免费的,具有我正在寻找的双向地图实现(Apache 中的 BidiMap,Google 中的 BiMap),大小惊人地几乎相同(Apache 493 kB,Google 499 kB)[编辑:不再是真的!]在所有方面都与我非常相似。

我应该选择哪一个,为什么?是否有其他等效的替代方案(必须是免费的并且至少具有双向地图)?我正在使用最新的 Java SE,因此无需人为地限制为 Java 5 或类似的东西。

4

5 回答 5

188

在我看来,更好的选择是Guava(以前称为 Google collections):

  • 它更现代(有泛型)
  • 它绝对遵循 Collections API 要求
  • 它被积极维护
  • CacheBuilder它的前身MapMaker简直太棒了

Apache Commons Collections 也是一个很好的库,但它长期以来一直未能提供支持泛型的版本(在我看来,这是集合 API 的一个主要缺点)并且通常似乎处于维护/不做-too-much-work-on-it 模式最近,Commons Collections 再次获得了一些动力,但它还有一些工作要做。.

如果下载大小/内存占用/代码大小是一个问题,那么 Apache Commons Collections 可能是更好的选择,因为它是其他库的常见依赖项。因此,也可以在您自己的代码中使用它,而无需添加任何额外的依赖项。编辑:这个特殊的“优势”现在已经被部分颠覆了,因为许多新库实际上依赖于 Guava 而不是Apache Commons Collections。

于 2009-09-18T13:10:49.780 回答
76

来自常见问题解答: Google 收藏集常见问题解答

Google 本来可以尝试改进 Apache Commons Collections,但为什么要构建这一切?

Apache Commons Collections 显然不能满足我们的需求。它不使用泛型,这对我们来说是个问题,因为我们讨厌从代码中获得编译警告。也长期处于“控股格局”。我们可以看到,在我们乐于使用它之前,我们需要大量投资来修复它,与此同时,我们自己的库已经在有机地增长。

Apache 库和我们的库之间的一个重要区别是,我们的集合非常忠实地遵守它们实现的 JDK 接口指定的契约。如果您查看 Apache 文档,您会发现无数违规示例。他们如此清楚地指出这些值得称赞,但仍然,偏离标准收集行为是有风险的!你必须小心处理这样的集合;错误总是在等待发生。

我们的集合是完全通用的,并且从不违反他们的合同(除了孤立的例外,JDK 实现已经为可接受的违反树立了一个强有力的先例)。这意味着您可以将我们的集合之一传递给任何需要 Collection 的方法,并确信事情会完全按照应有的方式工作。

于 2009-09-18T14:37:34.190 回答
72

我发现让 Google 收藏成为开始的最重要的事情:

  • 泛型(没有泛型的集合——FTL)
  • 与 Collections 框架的一致性(Josh Bloch 是该框架的关键参与者)
  • 正确性。这些人迫切需要解决这个问题。他们有类似 25K 的单元测试,并且与使 API 恰到好处有关。

这是主要作者发表的一段很棒的Youtube 视频,他很好地讨论了关于这个库的值得了解的内容。

于 2009-09-18T13:37:59.473 回答
-7

另外两件事(我希望我没有错)

  • Guava(谷歌收藏的新名称)的许可证是 Apache License 2.0,意思是:与 Apache Commons 项目的许可证相同
  • 我在要下载的文件中找不到 Guava 的源代码(似乎只有 git-access 是可能的)
于 2012-04-05T13:16:09.460 回答
-7

关于 Guava 的一件令人讨厌的事情是 Multimap 没有扩展 java.util.Map。如果您有自己的适用于 Maps 的方法,它们将不适用于 Guava Multimaps(Apache MultiMap 接口确实扩展了 java.util.Map)。我敢肯定,这是有原因的,但它也很不方便。

于 2012-07-05T10:08:31.673 回答