1

私の質問は、インターンが文字列と SPC (文字列プール定数) を持つ文字列で動作しており、インターンの概念も整数で動作している場合、整数プール定数はありますか?そうでない場合、どのように機能しますか?

class InternExample  
{  
 public void print()  
{    
 Integer i=10;  
 Integer j=10;  
 String c="a";  
  String s="a";  
 System.out.println(i==j);// prints true  
 System.out.println(c==s);//prints true  
}  
 public static void main(String args[])  
{  
  new InternExample().print();  
}  
}
4

3 に答える 3

7

@Joachim Sauer の回答に追加された、キャッシュの上限値を変更できます。

オプションのいくつかは次のとおりです。

  1. -Djava.lang.Integer.IntegerCache.high=値
  2. -XX: AutoBoxCacheMax =値
  3. -XX:+ AggressiveOpts

リンクJavaスペシャリスト

于 2011-06-01T09:53:08.750 に答える
5

自動ボクシングは、 § 5.1.7 Boxing Conversion of the JLS で定義されているように、共通の値のキャッシュを使用します。

ボックス化される値ptruefalse、 a byte、からcharまでの範囲の a 、または-128から 127 の間の数値である場合、およびを の任意の 2 つのボックス化変換の結果とします。それは常にそうです。\u0000\u007fintshortr1r2pr1 == r2

ただし、これは「インターン」とは呼ばれないことに注意してください。その用語は、Stringリテラルに対して行われること、および を使用して明示的に行うことができることに対してのみ使用されString.intern()ます。

于 2011-06-01T09:47:41.400 に答える
4

あなたの「平等の仮定」に注意してください。たとえば、整数の場合:

    Integer a = 69;
    Integer b = 69;
    System.out.println(a == b); // prints true
    Integer c = 1000;
    Integer d = 1000;
    System.out.println(c == d); // prints false

これは、Integer の内部実装によるもので、小さな値 (-127 から 128 まで) の整数の既存のオブジェクトがあります。ただし、より大きな整数の場合、個別のオブジェクト Integer が毎回作成されます。

ソースコードのリテラル文字列はすべて、コンパイラによって同じオブジェクトにリンクされます...彼はそれを行うのに十分賢いです。ただし、ファイルから文字列を読み取るか、実行時に文字列を作成/操作すると、それらは等しくなくなります。

    String a = "x";
    String b = "x";
    String c = new String("x");
    System.out.println(a == b); // prints true
    System.out.println(a == c); // prints false
于 2011-06-01T10:22:37.753 に答える