3

この質問は、 「 " " を使用して文字列を初期化するにはどうすればよいですか?」という質問の続きです。

IntegerDoubleCharacterFloatBooleanラッパー クラスでも、次のように宣言するのと同じ方法Stringで宣言できることに注意してください。

String s = "Test string"

Integer i = 10; //valid
Double d = 10.00; //valid
Boolean b = true; //valid

これらのクラスもクラスのように特別な扱いを受けますかString

4

5 に答える 5

4

以前の回答で指摘したように ( " " を使用して文字列を初期化するにはどうすればよいですか? )

はい、primitiveOOP で型を保持するために、設計者はprimitivesとの間のブリッジを作成し、特別な扱いをしていますObject'sWrappers

理由はdocsで明確に説明されています。

ただし、プリミティブの代わりにオブジェクトを使用する理由があり、Java プラットフォームはプリミティブ データ型ごとにラッパー クラスを提供します。これらのクラスは、プリミティブをオブジェクトに「ラップ」します。多くの場合、ラッピングはコンパイラーによって行われます。オブジェクトが予期される場所でプリミティブを使用すると、コンパイラーはそのラッパー クラスにプリミティブをボックス化します。同様に、プリミティブが予期されるときに数値オブジェクトを使用すると、コンパイラはオブジェクトをアンボックスします。詳細については、オートボクシングとアンボクシングを参照してください。

primitivesプログラムで広く使用しているため、次のような構文を許可するのは設計上の決定かもしれません

   Integer i = 10; //primitive style

次にmemory、型宣言compile_ _primitiveWrapperAssignment operator =

構文的には、それはより便利で幸せです(少なくとも私にとっては:))。

書くより、

   Integer i = new Integer(10); //Object creation style
于 2013-10-22T06:42:46.690 に答える
1

はい、プリミティブ Wrapper クラスも String クラスのように動作します。

以下のように説明できます

Integer i1 = new Integer(10); //valid
Integer i2 =10;
System.out.println(i1==i2); // this one is false
i1=10;  
System.out.println(i1==i2); //// this one is true
于 2013-10-22T06:48:33.913 に答える
0

String str = "Test String"; 特別待遇とは関係なく、特別待遇とはInteger i = 10;String s = "Test String";ですか?これらは文字列リテラルと呼ばれ、jvm の文字列定数プールでメモリを取得します。ガベージ コレクションに関して特別な重要性があるのは、プールされた定数がガベージ コレクションの影響を受けないことです。'str' を null にすると、"Test String" はガベージ コレクションの対象になりません。なぜ?:: JVM は、将来この「テスト文字列」を再利用しようとします。ガベージ コレクション アルゴリズムは、プールされたメモリにあるオブジェクトを除外します。したがって、通常の GC ルールはここでは適用されません。これをチェックしてください:なぜ文字列リテラルはガベージコレクションされないのですか

この処理は、ラッパーのオート ボクシングとはまったく異なります。自動ボクシングは JDK1.5 から導入されました。自動ボックス化と自動ボックス化解除Integer i = 10;コンパイラがこのステートメントを JVM の内部キャッシュ ラッパー オブジェクトのみに置き換えると、 残りInteger i = Integer.valueOf(10); の文字列リテラルはそうではないように動作します。内部キャッシュ ラッパー オブジェクトとは

Integer i = 100;
Integer j = 100;

参照 i & j は、単一の既存オブジェクトのアドレスで与えられます。それが理由ですif( i==j) //true

Integer k = 130; 
if( i==k) // false

k の値が-128 to 127整数のキャッシュ範囲を超えているためです。これを確認してください:値の範囲が -128 から 127 の場合の整数ラッパーの動作 上記で、参照 k を無効にすると、そのオブジェクトは文字列リテラルのように同じ処理ではない GC を受けます。i または j を無効にすると、対応するキャッシュされたオブジェクトは、文字列リテラルと同じ扱いである GC の影響を受けません。

于 2013-10-22T07:30:38.600 に答える