2017-12-03 9 views
2

最初のバージョンは次のとおりです。これらの2つのJavaデータ構造の違いは何ですか?

int[] a = new int[1000]; 
int[] b = new int[1000]; 

番目のバージョンは以下のとおりです。

class Helper{ 
    int a; 
    int b; 
} 
Helper[] c = new Helper[1000]; 

私の直感は二番目が優れていると言われますが、私はその理由で自分自身を説得できた.... 缶誰も私のためにこれらの2つの構造の時間の複雑さと空間の複雑さを比較する。たとえば、これら2つのバージョンのコストは同じですか?または、第2のコストはそれほどかかりませんか? ありがとうございました!

+1

クイックアンサー:Googleの "並列配列対構造"。それはあなたにそれの数を与えるでしょう。 –

+0

文脈がなければ、2番目の方が良いかどうかはわかりません。概念的にどのように関連しているかによって異なります。 – Carcigenicate

+0

両方のオプションでヘルパーを 'aa'プロパティでソートしてみてください。 –

答えて

4

質問する必要があります本当の質問aa[i]bb[i]の間の関係です。 aa[i]bb[i]が同じオブジェクト(「ヘルパー」よりも意味のある説明を持つ)のプロパティである場合、複数のプリミティブ配列を使用するのではなく、それらを間違いなくいくつかのクラスに配置する必要があります。結局のところ、Javaはオブジェクト指向言語です。

パフォーマンスの違いに注意する必要はありません。それらは重要ではありません。重要なことは、あなたがコードを読む人には意味があるということです。

+0

また、 'List'は配列に対して優先されるべきです。 'Arrays.asList'はその変換を容易にします。 – 4castle

+2

@ 4castleそれはユースケースによります。 OPが事前にサイズがわかっている固定サイズのコンテナが必要な場合、配列はリストよりも効率的です。 – Eran

+0

'Arrays.asList'は、同じ配列への参照を格納するラッパー' List'実装を返します。まだ固定サイズです。 – 4castle

1

Eranが正しい間に、もう少しポイントを追加します。

確かに、パフォーマンスについて気にならない可能性があります。その違いは、汎用アプリケーションにとっては非常に重要ではありません。 可読性が重要ですです。

はまだ、技術的な詳細の観点:

宇宙複雑(それは常にあなたが持っているなど、多くの要素だ)と同じですが、バイト単位の絶対値が異なっています。

各ペアの配列にはさらに多くのコストがかかります。各Javaオブジェクトには数バイトのオーバーヘッドがあります。 2つの配列の場合は、配列ごとにわずか数バイトのオーバーヘッドです。

また、2つのアレイの場合、各アレイの値はメモリ内に互いに隣接して配置されます。これらのアレイのすべての値を読み取ると、CPUキャッシュとメモリのレイアウトがより効果的になります。オブジェクトの配列の場合、それらのオブジェクトへのリンク配列があり、フィールドの実際の値にアクセスするには、まずオブジェクトのアドレスを読み取る必要があります。

これは単なる一般的な点ですので、何が起こっているのかを知ることができます。実際には、それらの構造をどのように使いたいかによって異なります。

関連する問題