Java 谷歌番石榴vs.Apache Commons

Java 谷歌番石榴vs.Apache Commons,java,collections,apache-commons,guava,Java,Collections,Apache Commons,Guava,我正在寻找Java实现,偶然发现了以下两个库: (原“谷歌收藏”) 两者都是免费的,都有我正在寻找的双向映射实现(Apache中的BidiMap,Google中的BiMap),它们的大小惊人地几乎相同(Apache 493 kB,Google 499 kB)[编辑:不再是真的!]而且在所有方面都与我非常相似 我应该选择哪一个,为什么?是否有其他等效的替代方案(必须是免费的,并且至少具有双向映射)?我正在使用最新的Java SE,因此不需要人为地限制Java 5或类似的东西。在我看来,更好的

我正在寻找Java实现,偶然发现了以下两个库:

  • (原“谷歌收藏”)
两者都是免费的,都有我正在寻找的双向映射实现(Apache中的BidiMap,Google中的BiMap),它们的大小惊人地几乎相同(Apache 493 kB,Google 499 kB)[编辑:不再是真的!]而且在所有方面都与我非常相似


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

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

  • 它更现代(有仿制药)
  • 它完全符合集合API的要求
  • 它是积极维护的
  • 它的前身是非常棒的
Apache Commons Collections也是一个很好的库,但它一直未能提供支持泛型的版本(在我看来,这是Collections API的一个主要缺点),并且总体上似乎处于维护/不做太多工作的模式最近Commons Collections又有了一些进展,但它还有一些需要弥补的地方


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

我发现的最重要的事情使Google Collections成为起点:

  • 泛型(没有泛型的集合--FTL)
  • 与集合框架的一致性(Josh Bloch是该框架中的关键角色)
  • 正确性。这些人拼命想把这个问题解决好;他们有大约25K个单元测试,并且与获得正确的API有关
以下是主要作者的精彩演讲,他很好地讨论了关于该库的哪些内容值得了解。

来自常见问题解答:

谷歌本可以尝试改进Apache Commons集合,但为什么要构建所有这些呢?

Apache Commons集合显然不能满足我们的需求。信息技术 不使用泛型,这对我们来说是个问题,因为我们不喜欢使用泛型 我们代码中的编译警告。也一直处于"搁置"状态 很长一段时间以来,这种模式一直被人们所接受。我们可以看出,这需要一个漂亮的 我们投入了大量资金来修复它,直到我们乐于使用它, 与此同时,我们自己的图书馆已经在有机地发展

Apache库和我们的库之间的一个重要区别是 我们的收藏品非常忠实地遵守 它们实现的JDK接口。如果您查看Apache 在文档中,您会发现无数的违规示例。他们 值得赞扬的是,他如此清楚地指出了这些问题,但仍然存在偏差 从标准收集行为是有风险的!你必须小心什么 你如何处理这样的收集;虫子总是等着发生

我们的收藏是完全通用的,从不违反合同 (除了个别例外,JDK实现已经设置了一个强大的 可接受违规行为的先例)。这意味着您可以通过其中一个 我们的集合适用于任何需要集合和感觉的方法 我很有信心事情会如期进行

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

  • Guava(google collections的新名称)的许可证是Apache许可证2.0,意思是:与Apache Commons项目相同
  • 我在下载的文件中找不到Guava的源代码(似乎只有git才能访问)

番石榴最讨厌的一点是,Multimap没有扩展java.util.Map。如果您有自己的方法可以在地图上工作,那么它们就不能在Guava Multimaps上工作(Apache MultiMap接口扩展了java.util.Map)。我相信,这样做有一些很好的理由,但也很不方便。

您肯定应该给我们提供选择图书馆的标准吗?许可证、性能、附加依赖项、支持泛型……Google Collections可在repo1.maven.org上获得:我已更正——我正在com/googlecode+1中查找视频链接,了解Google Collections的更多信息:(对其主要创建者的采访)。寻找问题“您的方法有什么独特之处?它与Apache Commons Collection(例如)有何不同?”Apache Commons Collections版本4使用泛型。我真正想知道的是:为什么没有其他意见?我应该扮演魔鬼代言人吗?Apache Commons Collections毕竟是一个不错的库。由于Apache缺少泛型,我认为很明显这两个库中哪一个是未来的库。谷歌是下一个合乎逻辑的进步。这是一种奇怪的感觉,虽然,它是由巨人建造的。。。但只要它是在一个免费的许可证下,即使它是由微软制造的也不重要。我猜。读者应该知道这是一个非常古老的答案,而且已经有很多changed@RoyTruelove这并不奇怪,我已经改变了很多,我很想听听你目前对这件事的想法,或者是最近的评论/比较的链接。我喜欢“默认不可变/只有在需要时才可变”的哲学和在番石榴中加入仿制药,但我读到的材料可能都像你所说的那样过时了。@testerjoe2-对不起,我很久以前就写过这条评论了,坦率地说,我不记得它的原因了。事后看来,这是一个好消息