0

少しグーグルで調べてみましたが、この質問に対する決定的な答えを見つけることができませんでした。明確にするために、次のようなクラスを考えてみましょう。

public class MyContainer<T> {
    private T[] _store;
    private int _size;
    ...
}

への参照を持つ変数はや のようなプリミティブ ラッパー クラスで宣言する必要があり、 のインスタンスはそれらの同じラッパーで作成する必要があるという事実にもかかわらず、タイプshortvs.の配列を使用して得られるメモリ節約を達成することは可能ですか?クラス?intMyContainerShortIntegerMyContainer

私の検索では、Javaコンパイラがジェネリックに型消去を適用することがわかりましたが、Javaがジェネリック型配列に対して何らかの最適化を行っていないと仮定できるかどうかはわかりません。

誰かがこれに賛成または反対の証拠を持っていますか? 前もって感謝します。

4

4 に答える 4

4

ジェネリック自体はメモリの節約を提供せず、Integer/Short は同等のプリミティブよりも大きくなります。

ただし、 Integer.valueOf( int) または Short.valueOf( short) を使用するか、単純な自動ボクシングを使用すると、共通の小さな正および負の数値に対して共有インスタンスが再利用されます。そのため、各値を個別にインスタンス化するよりもメモリを節約できます。

参照: http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html#valueOf(int)

ジェネリックはオブジェクト参照int型であるため、プリミティブまたはの配列よりも多少大きく/遅くなる傾向がありますshort。Java は、JVM がすべてのインスタンスList<Integer>間で同じクラスとバイトコードを内部的に共有するため、他のリストと比較して、空間または時間の最適化を汎用コレクションに適用しません。Listこれは配列にも当てはまります。

パフォーマンスが重要なスタックの下部近くで使用されるコア コードでない限り、メモリやパフォーマンスについて心配する必要はありません。最も深くループし、頻繁に使用され、パフォーマンスが最も制約されているコード セクションのみを、設計段階の最適化の候補にする必要があります。

于 2013-09-20T01:13:46.130 に答える
2

いいえ。ジェネリックは、プリミティブメモリ節約とは何の関係もありません

于 2013-09-20T01:17:57.430 に答える
2

への参照を持つ変数はや のようなプリミティブ ラッパー クラスで宣言する必要があり、 のインスタンスはそれらの同じラッパーで作成する必要があるという事実にもかかわらず、タイプshortvs.の配列を使用して得られるメモリ節約を達成することは可能ですか?クラス?intMyContainerShortIntegerMyContainer

既存の回答に基づいて構築するために、バッキングプリミティブ配列を使用してジェネリックコレクションインターフェイスを実装することは可能ですが、ジェネリックには実装できませ。たとえば、Guavaは、によってサポートされている実装をInts.asList(int...)返し、そのすべてのメソッド呼び出しで単純にボックス化/ボックス化解除します。しかし、Guava にはプリミティブごとにそのパターンの個別の実装があります。あなたが望むようにそれを統一する方法はありません。List<Integer>int[]

于 2013-09-20T02:05:59.893 に答える