6

Java でクラスを作成しているときに、事前にわかっているインスタンス レベルのコレクションを作成していることに気付くことがよくあります (コレクション内のアイテムは 10 未満)。しかし、事前にアイテムの数がわからないので、通常は動的コレクション (ArrayList、Vector など) を選択します。

class Foo
{
  ArrayList<Bar> bars = new ArrayList<Bar>(10);
}

私の一部は、これほど小さなサイズのものに複雑な動的コレクションを使用するのは無駄だとしつこく言い続けています。このようなものを実装するより良い方法はありますか? それともこれが標準ですか?

注意してください、私は(顕著な)パフォーマンスのペナルティやそのようなものに見舞われていません。これは、物事を行うためのより良い方法がないかどうか疑問に思っているだけです。

4

4 に答える 4

10

JavaのArrayListクラスには、配列への参照とサイズの2つのデータメンバーしかありません。Object[]これは、を使用しない場合はとにかく必要ですArrayList。したがって、を使用しないことの唯一の利点は、ArrayList1つのオブジェクトの割り当てを節約することです。これは、大きな問題になる可能性はほとんどありません。

コンテナクラスの非常に多くのインスタンス(ひいてはArrayListインスタンス)を毎秒作成して破棄する場合、ガベージコレクションのチャーンにわずかな問題が発生する可能性がありますが、それが発生した場合は心配する必要があります。ガベージコレクションは、通常、最も心配する必要はありません。

于 2008-09-11T17:48:59.527 に答える
3

物事をシンプルに保つために、これはほとんど問題ではないと思います。実装は十分に柔軟であるため、将来要件が変更された場合でも、リファクタリングを余儀なくされることはありません。また、ハイブリッド ソリューションのコードにロジックを追加しても、小さなデータ セットと Java のコレクション API の高品質を考慮すると、それほど価値はありません。

于 2008-09-11T18:03:39.927 に答える
2

Google Collectionsには、不変/少数の要素用に最適化されたコレクションがあります。Lists.asList例として API を参照してください。

于 2008-09-11T18:57:58.253 に答える
1

オーバーヘッドは非常に小さいです。最初のいくつかの項目のフィールドを持つハイブリッド配列リストを作成してから、より長いリストの配列を使用するようにフォールバックすることができます。

配列を使用することで、リストオブジェクトのオーバーヘッドを完全に回避できます。さらにハードコアにするには、フィールドをObjectとして宣言し、単一のアイテムの配列を完全に回避することができます。

メモリが本当に問題になる場合は、低レベルでのオブジェクトインスタンスの使用を忘れることができます。代わりに、より大きなレベルの粒度でより大きなデータ構造を使用してください。

于 2008-09-11T17:45:18.443 に答える