Apache Commons与Guava(前身为“Google Collections”)

我正在寻找在Java中的双向映射实现,偶然发现这两个库:

  • Apache Commons集合
  • 番石榴 (以前称为“Googlecollections”)

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

我应该select哪一个,为什么? 还有其他一些等同的select(必须是免费的,至less有双向映射)? 我正在使用最新的Java SE,所以不需要人为限制Java 5或类似的东西。

在我看来,更好的select是番石榴 (以前称为谷歌collections):

  • 它更现代化(有generics)
  • 它绝对遵循Collections API的要求
  • 它积极维护
  • CacheBuilder和它的前身MapMaker都非常棒

Apache Commons Collections也是一个很好的库,但是它一直没有提供generics启用的版本(这在我看来是一个集合API的主要缺点),而且通常似乎在维护/不做在这种模式下工作多了最近Commons Collections再次获得了一些蒸汽,但它有一些追赶的事情。

如果下载大小/内存占用空间/代码大小是一个问题,那么Apache Commons Collections可能是更好的select,因为它是其他库的常见依赖。 因此,在自己的代码中使用它也可能会在不添加任何附加依赖的情况下完成。 编辑:这个特殊的“优势”已经被部分地颠覆了,因为许多新的库实际上依赖于番石榴而不是 Apache Commons Collections。

我发现最重要的事情是让Google Collections成为开始的地方:

  • generics(没有generics的集合 – FTL)
  • 与集合框架的一致性(Josh Bloch是这个框架中的关键人物)
  • 正确性。 这些家伙拼命解决这个问题是正确的。 他们有一些像25Kunit testing,并与获得API恰到好处。

这里有一个很棒的Youtubevideo ,主要作者给出了一个演讲,他很好地讨论了什么是值得了解这个图书馆。

来自常见问题解答: Google Collections FAO

为什么Google可以试图改进Apache Commons Collections呢?

Apache Commons Collections很明显不符合我们的需求。 它不使用generics,这对我们来说是一个问题,因为我们讨厌从代码中获取编译警告。 长期以来也处于“持续”的状态。 我们可以看到,我们需要一笔相当大的投资来修复它,直到我们乐于使用它,同时,我们自己的图书馆已经在有机地增长。

Apache库与我们之间的一个重要区别是,我们的集合非常忠实地遵守他们实现的JDK接口指定的契约。 如果您查看Apache文档,您会发现无数的违规示例。 他们应该得到这样的清楚指出,但偏离标准收集行为是有风险的! 你必须小心你对这样一个集合做什么; 错误总是等待发生。

我们的集合是完全生成的,从不违反他们的合同(有一些孤立的例外,JDK的实现为可接受的违规设定了强有力的先例)。 这意味着您可以将我们的集合中的任何一个传递给期望集合的任何方法,并且确信事情将完全按照它们应该的方式工作。

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

  • Guava的许可证(谷歌collections的新名称)是Apache许可证2.0,意思是:与Apache Commons项目相同
  • 我无法在一个文件中find番石榴的源代码下载(似乎只有一个git访问是可能的)

关于番石榴的一个令人讨厌的事情是Multimap不扩展java.util.Map。 如果你有自己的方法在Maps上工作,他们将不能在Guava Multimaps上工作(Apache MultiMap接口确实扩展了java.util.Map)。 我确信有一个很好的理由,它是这样的,但也是不方便的。