Java での小規模 (1 ~ 10 項目) のインスタンス レベルのコレクションの使用
-
09-06-2019 - |
質問
Java でクラスを作成しているときに、非常に小さい (コレクション内の項目が 10 個未満) と事前にわかっているインスタンス レベルのコレクションを作成していることによく気づきます。ただし、事前に項目の数がわからないため、通常は動的コレクション (ArrayList、Vector など) を選択します。
class Foo
{
ArrayList<Bar> bars = new ArrayList<Bar>(10);
}
私の心の一部は、これほど小さいサイズのものに複雑な動的コレクションを使用するのは無駄だということを常に主張しています。このようなものを実装するより良い方法はありますか?それともこれが標準なのでしょうか?
(目立った) パフォーマンス上のペナルティやそのようなものは受けていないことに注意してください。これは私がもっと良い方法はないかと考えているだけです。
解決
の ArrayList
Java のクラスにはデータ メンバーが 2 つしかありません。 Object[]
配列とサイズ - を使用しない場合はいずれにしても必要です。 ArrayList
. 。したがって、を使用しないことの唯一の利点は、 ArrayList
オブジェクトの割り当てが 1 つ節約されますが、これは大したことではありません。
コンテナ クラスの非常に多くのインスタンス (ひいては、 ArrayList
例)毎秒、あなたは かもしれない ガベージ コレクションのチャーンに若干の問題がありますが、それが発生した場合は心配する必要があります。通常、ガベージ コレクションはほとんど心配する必要はありません。
他のヒント
物事をシンプルにするために、これはほとんど問題ではないと思います。実装は十分に柔軟であるため、将来要件が変更された場合でも、リファクタリングを強いられることはありません。また、小規模なデータ セットと Java の Collection API の高品質を考慮すると、ハイブリッド ソリューションのコードにロジックを追加する価値はありません。
Google コレクション 不変/少数の要素向けに最適化されたコレクションがあります。見る Lists.asList
API の例。
オーバーヘッドは非常に小さいです。最初のいくつかの項目のフィールドを持つハイブリッド配列リストを作成し、その後、長いリストには配列を使用するようにフォールバックすることができます。
配列を使用すると、リスト オブジェクトのオーバーヘッドを完全に回避できます。さらに本格的に行うには、フィールドを Object として宣言し、単一の項目に対して配列を完全に避けることができます。
メモリが本当に問題である場合は、低レベルでのオブジェクト インスタンスの使用を忘れた方がよいかもしれません。代わりに、より大きな粒度レベルでより大きなデータ構造を使用します。