о стажере в Яве - PullRequest
       42

о стажере в Яве

1 голос
/ 01 июня 2011

мой вопрос, если стажер работает со строкой и строкой, имеющей SPC (константа пула строк) для него и концепция intern также работают с целыми числами, так есть ли целочисленная константа пула? если нет, то как она работает?

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();  
}  
}

Ответы [ 3 ]

7 голосов
/ 01 июня 2011

Добавлено к @ Йоахиму Сауэру ответа, мы можем изменить значение верхней границы кэша .

Некоторые из опций

  1. -Djava.lang.Integer.IntegerCache.high = значение
  2. -XX: AutoBoxCacheMax = значение
  3. -XX: + AggressiveOpts

Ссылка : Специалист по Java

5 голосов
/ 01 июня 2011

Автобокс использует кеш общих значений, как определено в § 5.1.7 Преобразование в бокс JLS :

Если значение p в штучной упаковке равноtrue, false, byte, char в диапазоне от \u0000 до \u007f или число int или short в диапазоне от -128 до 127, затем пусть r1 иr2 будет результатом любых двух преобразований бокса p.Это всегда тот случай, когда r1 == r2.

Обратите внимание, что это , а не , называемое "интернирование".Этот термин используется только для того, что делается для String литералов и что можно сделать явно, используя String.intern().

4 голосов
/ 01 июня 2011

Остерегайтесь ваших "предположений о равенстве". Например, с целыми числами:

    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
...