2017-08-01 13 views
12

List<Map<String, String>>List<Object>の使用法とパフォーマンスの違いは何ですか? 3種類のキー値ペアしか持たないマップのリストを作成しなければならない場合、代わりに3つのプロパティを持つオブジェクトを作成してオブジェクトのリストを作成できます。List <Map <String、String >> vsリスト<Object>

ここでの質問は、どのシナリオでどちらを使用すべきかという2つのアプローチのうちのどれですか?

+0

なぜ質問が再開されましたか?それはまだ意見ベースです。 –

+0

@ MuratK。異なるシナリオで使用された場合の構文とパフォーマンスの観点からの客観的(つまり、非意見ベースの)相違を見ることができます。しかし、「どちらを使うべきか」全体が、意見に基づくベストプラクティスになる傾向があり、おそらく[ソフトウェアエンジニアリング。それはいずれかの方法を行くことができるように思える。 – Dukeling

答えて

26

最初の私たちが話しているか明確にできます:それは

Fooのオブジェクトは、マップに格納される「プロパティ」の数を、(持って
List<Foo> 

List<Map<String, String>> 

ですキーの値のペア)をオプション1で置き換えます。

この場合、絶対にの2つのに行ってください。単に良いOOPは有用な抽象を作成することであるから、別名モデル。意味:が属している属性がの場合、それらをラップするクラスを使用するのが自然な方法です。

これは、(マップアクセスを避けるため)パフォーマンスに若干の利点がありますが、重要な点は、コンパイル時にのコードが書かれていることです。あなたは以下を参照してください。

int foo = list.get(0).map.get("key"); 

ランタイム時に失敗することができます - マップがそのキーが含まれている場合、あなたは知らない、それが整数である場合。

しかし

int foo = list.get(0).getFoo(); // resp. ...get(0).fieldName 

は、コンパイラによって確認することができます! (はい、それらのget()呼び出しはまだ実行時に失敗することができますが、それはあなたが、とにかく周りを取得していないものです)その向こう

は、このレベルでのパフォーマンスについてを心配しないでください:すべての最初に、 が本当にがJavaコードを書くときのパフォーマンスにどのような影響を与えるのかを理解する必要があります。 「このコードは醜いですが、より良いパフォーマンスをもたらすかもしれません」という考えを絶対に避けたいからです。仕事を真っ直ぐに進めるクリーンなコードを書くことに集中してください。 決してを書く表現が少ないコードを仮定するとより速いです。パフォーマンスの問題が発生した場合 - コードをプロファイルし、根本的な原因を特定して修正します。

あなたのコードのの品質に影響を与える時期尚早の最適化の考えを許可しないでください。あなたのクラスを提供

+0

小さな一日を始める! – davidxxx

4

はこのようなものになります。

class Foo 
{ 
    private final String a; 
    private final String b; 
    private final String c; 

    // constructor and getters 
} 

List<Foo>を使用することにつながる:

パフォーマンスクラスを使用しての

パフォーマンスはおそらくマップに非常によく似ています。たとえば、ほとんどのマップ実装では、HashMapは、O(1)を取得し、を入力します。の操作を行います。あなたのオブジェクトにゲッターメソッドを呼び出すよりも大幅に遅くなることはありません。

使用法、3「キー」は常に同じである場合:

クラスはおそらく使用する方がはるかに簡単です。 Map<String, String>がある場合、各マップに正確に3つのキー「A」、「B」および「C」が含まれていることを強制する簡単な方法はありません。誰かがキー "D"を追加すればどうなるでしょうか?誰かが鍵Aを取り除くとどうなるでしょうか?

カスタムクラスでは、これはコンストラクタ(コンパイル時のチェック)によって簡単に実行できます。

使用法、3「キー」が同じでない場合:

複数のクラス、そしておそらくクラス階層のいくつかの種類がなくても、簡単にこれを実現することはできません。おそらく地図が良いでしょう。

関連する問題