Google Guava対Apache Commons [終了]


212

私はJavaで双方向のマップ実装を探していて、次の2つのライブラリに出くわしました。

どちらも無料で、私が探していた双方向マップ実装(ApacheのBidiMap、GoogleのBiMap)があり、驚くほどほぼ同じサイズです(Apache 493 kB、Google 499 kB)[ed .: no true true!]すべての点で私にかなり似ています。

どちらを選択する必要がありますか。その理由は何ですか。他に同等の代替案がありますか(無料で、少なくとも双方向マップが必要です)?私は最新のJava SEを使用しているため、Java 5などに人工的に制限する必要はありません。


5
確かに、ライブラリを選択するための基準を教えてください。ライセンス、パフォーマンス、追加の依存関係、サポートジェネリックなど
SteveD

1
Googleのコレクションはrepo1.maven.orgで提供されています:repo1.maven.org/maven2/com/google/collections/...
ヨアヒム・ザウアー

私は正直しています-私はcom / googlecodeで探していました
kdgregory

回答:


185

私の意見では、より良い選択はGuava(以前はGoogleコレクションとして知られていました)です:

  • より現代的です(ジェネリックがあります)
  • コレクションAPIの要件に完全に従う
  • 積極的に維持されている
  • CacheBuilderそしてそれは前任者MapMakerはただ素晴らしかったです

Apache Commons Collectionも優れたライブラリですが、ジェネリック対応バージョンを提供することに長い間失敗しており(私の意見では、コレクションAPIの主な欠点です)、一般にメンテナンス中/実行しないようです。 -too-much-work-on-itモード最近、Commons Collectionsは再び勢いを増しましたが、それに追いつくために追いついています。

ダウンロードサイズ/メモリフットプリント/コードサイズが問題である場合、他のライブラリの一般的な依存関係であるため、Apache Commons Collectionの方が適している可能性があります。したがって、独自のコードでそれを使用することも、追加の依存関係を追加せずに実行できる可能性があります。編集:多くの新しいライブラリは実際にはApache Commons Collection ではなく Guavaに依存しているため、この「利点」は部分的に覆されています。


3
私が本当に不思議に思っていること:なぜ他の意見がないのですか?私は悪魔の擁護者を演じるべきですか?結局のところ、Apache Commons Collectionsは悪いライブラリではありません。
ヨアヒムザウアー

10
Apacheにはジェネリックスがないので、これら2つのうちどちらが未来かは明らかだと思います。Googleは次の論理的な前進です。それは奇妙な感じですが、The Giantによって作成されたのですが、無料のライセンスの下にある限り、Microsoftによって作成されたとしても問題になりません。私は推測する。
Joonas Pulakka 09/09/21

12
これは非常に古い回答であり、多くの点が変更されていることを読者は認識しておく必要があります
Roy Truelove 2014年

1
@RoyTruelove大きな変化があったことには驚きません。問題についての現在の考えや、より最近のレビュー/比較へのリンクを聞きたいと思います。私は「デフォルトで不変/必要な場合にのみ変更可能」の哲学とグアバにジェネリックを含めることが好きですが、私が読んでいる資料はすべて、このスレッドになったと言っているように日付が付けられている可能性があります。
joeA 2014年

2
@ testerjoe2-すみません、私は長い間そのコメントを書いており、率直に言ってその理由を覚えていません。振り返ってみると、それはかなり役に立たないものでした!ライブラリが2010年以降変更されていないことに気づきませんでしたが、ライブラリが引き続き頻繁に使用されていることはわかっているので、安全である必要があります。今日新しいプロジェクトを始めていたら、おそらくGoldman Sachのコレクションlib:github.com/goldmansachs/gs-collectionsをよく見るでしょう。あなたが世界で最も邪悪な企業の1つである場合、あなたは本当にあなたがキッカスのJavaコレクションライブラリを持っていることを確認する必要があります。
ロイTruelove 2016

72

よくある質問から: Googleコレクションのよくある質問

代わりに、Apache Commons Collectionsを改善しようとした可能性があるのに、なぜGoogleはこれをすべて構築したのですか?

Apache Commons Collectionsは明らかに私たちのニーズを満たしていませんでした。これはジェネリックを使用しません。これは、コードからコンパイル警告を取得するのが嫌いなため、問題になります。それはまた、長い間「保持パターン」にありました。私たちがそれを使用して満足するまでそれを修正するために私たちからかなり大きな投資が必要であり、その間、私たち自身のライブラリーはすでに有機的に成長していることがわかりました。

Apacheライブラリと私たちのライブラリの重要な違いは、私たちのコレクションが、それらが実装するJDKインターフェースによって指定された規約に非常に忠実に準拠していることです。Apacheのドキュメントを確認すると、違反の例が無数にあります。彼らはこれらをはっきりと指摘していることで信用に値しますが、それでも、標準の収集動作から逸脱することは危険です!このようなコレクションをどう扱うかには注意が必要です。バグは常に発生するのを待っているだけです。

私たちのコレクションは完全に生成されており、契約に違反することはありません(JDKの実装が許容可能な違反の強力な先例を設定している孤立した例外を除きます)。これは、コレクションの1つを、コレクションを期待する任意のメソッドに渡すことができ、物事が正しく機能することを確信できることを意味します。


71

私が見つけた最も重要なことは、Googleコレクションを出発点にしています。

  • ジェネリック(ジェネリックのないコレクション-FTL)
  • コレクションフレームワークとの整合性(Josh Blochはこのフレームワークの主要なプレーヤーでした)
  • 正当性。これらの人たちは、この問題を正すことに必死に結びついています。彼らは25Kのユニットテストのようなものを持っており、APIを適切に取得することに結びついています。

これは、主要な著者によって与えられた講演の素晴らしいYoutubeビデオです。彼は、このライブラリーについて知っておく価値のあることについてよく議論しています。


7
ビデオリンクの+1
Jesper

1
Googleコレクションについてさらに詳しく読む:javalobby.org/articles/google-collections(主要なクリエイターへのインタビュー)。「あなたのアプローチの特徴は何ですか?たとえば、Apache Commons Collectionとどう違うのですか?」という質問を探してください。
Jonik

4
Apache Commons Collectionsバージョン4はジェネリックを使用します。commons.apache.org/proper/commons-collections/release_4_0.html
Abdull

-7

他に2つあります(私が間違っていないといいのですが)

  • グアバのライセンス(グーグルコレクションの新しい名前)は、Apache License 2.0です。つまり、Apache Commonsプロジェクトと同じです。
  • ダウンロードするファイルにGuavaのソースコードが見つかりません(gitアクセスしかできないようです)

19
ソース?Eclipseに添付できるjarですか?ここです。ところで:何が悪いのgit clone https://code.google.com/p/guava-libraries/git checkout v11.0.2
Xaerxess、2012

-7

Guavaの1つの厄介な点は、Multimapがjava.util.Mapを拡張しないことです。マップで機能する独自のメソッドがある場合、それらはGuavaマルチマップでは機能しません(Apache MultiMapインターフェースはjava.util.Mapを拡張します)。それがそうであるのにはいくつかの正当な理由があると私は確信していますが、それも不便です。


16
使いたい場合 MultimapようMap、常にasMap()ビューがあります。
Xaerxess 2012

22
マルチマップがjava.util.Mapを実装することをどのように期待しますか?マルチマップは、基本的にマップとは異なります。
sleske 2012年

1
Multimap <K、V>はMap <K、Collection <V >>を拡張します。ただし、GがMapをスーパーインターフェイスとして使用しないことには十分な理由があると思います。
マット

10
@lucek:のJavadocを見るMapと、へのすべての参照Vが実際にはCollection<V>であることがわかると、それがの優れたスーパーインターフェースではない理由がすぐにわかると思いますMultimap<K, V>
ruakh
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.