9

私のクラスの1つに、 type のフィールドがありCharacterます。charフィールドに「値がない」場合があり、nullこの(不足している)情報を表す最もクリーンな方法を私に縫い付けることがあるため、私はそれを好みました。

ただし、このアプローチのメモリフットプリントについては疑問に思っています。私は何十万ものオブジェクトを扱っていますが、2 つのオプションの違いはごくわずかであり、調査に値するかもしれません。

私の最初の賭けは、aがオブジェクトであるのcharに対し、a は 2 バイトかかるということです。しかし、などのボックス化されたプリミティブは通常のクラスではないことCharacterを知っています (ボックス化とボックス化解除について考えてください)。IntegerCharacter

さらに、Characterガベージは他のものと同じように収集されますか、それともライフサイクルが異なりますか? それらは共有リポジトリからプールされていますか? これは標準ですか、それとも JVM の実装に依存しますか?

この問題について、インターネット上で明確な情報を見つけることができませんでした。情報を教えていただけますか?

4

3 に答える 3

1

Character キャラクターの作成に使用している場合は、使用することをお勧めします

Character.valueOf('c'); // it returns cached value for 'c' 

Character c = new Character('c');// prefer to avoid

以下は javadoc からの抜粋です。

新しい Character インスタンスが必要ない場合、このメソッドは、頻繁に要求される値をキャッシュすることにより、空間と時間のパフォーマンスが大幅に向上する可能性が高いため、Character.valueOf()通常はコンストラクターよりも優先して使用する必要があります。Character(char)

于 2013-03-22T09:48:39.200 に答える
1

int代わりに使用してください。-1「文字なし」を表すために使用します。

たとえば、このパターンの多くの優先順位int read() in java.io.Reader

于 2013-03-22T16:07:11.340 に答える
0

あなたが述べたように、Characterオブジェクトは になる可能性があるため、 null になれないnull通常のものよりもRAM内でより多くの場所を占める必要があります。ある意味で、 s は s のスーパーセットです。charCharacterchar

ただし、コードの特定の部分で、JIT コンパイラーは、Character決して null ではなく、常に通常として使用されることを検出しchar、その部分を最適化して、CharacterRAM を使用しないようにしたり、実行が遅くなったりしないようにすることができます。私はまさにこの点について推測しているだけですが、JIT が実際にこの正確な最適化を実行できるかどうかはわかりません。

于 2013-03-22T09:54:49.953 に答える