2013-07-08 2 views
1

мне интересно, почему в следующем коде:String.intern(), как точно работает

String args0 = args[0]; 
    String args1 = args[1]; 
    args0.intern(); 
    args1.intern(); 

    if (args0==args1){ 
     System.out.println("Success"); 
    } else { 
     System.out.println("Failure"); 
    } 

, передав в качестве аргумента командной строки 2 одинаковых строк она возвращает failure.

Заранее спасибо.

+4

возможно дубликат [? Как сравнить строки в Java] (http://stackoverflow.com/questions/513832/how- do-i-compare-strings-in-java) –

+0

Будучи 'String' inmutable, вам не нужно будет присваивать экземпляр' intern() 'возвращает, чтобы ссылаться на экземпляр интернированного? 'args0' и' args1' по-прежнему являются исходными отдельными экземплярами массива. –

+0

Полезная информация о String.intern: http://stackoverflow.com/questions/1091045/is-it-good-practice-to-use-java-lang-string-intern – fvu

ответ

1

Вы должны сделать:

if (args0.intern() == args1.intern()){ 
    System.out.println("Success"); 
} 
0

Строки непреложный.

.intern() возвращает (возможно) другой Строковый экземпляр, находящийся в старом бассейне.

Вы выбрасываете этот экземпляр.

4

Будучи String inmutable, вам необходимо назначить экземпляр intern() возвращается для того, чтобы переменные ссылки на интернирован экземпляр, так что == сравнение вернется true.

String args0 = args[0]; 
String args1 = args[1]; 
args0 = args0.intern(); 
args1 = args1.intern(); 

if (args0==args1){ 
    System.out.println("Success"); 
} else { 
    System.out.println("Failure"); 
} 

В вашем примере args0 и args1 по-прежнему ссылается на оригинальные отдельные экземпляры в массиве.

0

Java автоматически ставит строковые литералы. Это означает, что во многих случаях оператор == работает для строк так же, как и для ints или других примитивных значений.

Поскольку интернирование является автоматическим для строковых литералов, метод intern() используется для строк, построенных с использованием new String().

Вы можете передать этот пример также:

public class Test 
{ 
    public static void main(String args[]){ 
     String Str1 = new String("Welcome to Tutorialspoint.com"); 
     String Str2 = new String("WELCOME TO SUTORIALSPOINT.COM"); 

     System.out.print("Canonical representation:"); 
     System.out.println(Str1.intern()); 

     System.out.print("Canonical representation:"); 
     System.out.println(Str2.intern()); 
    } 
} 
0

(я предполагаю, что args0 и args1 имеет строк с одинаковым значением)

  1. args0.intern() будет проверить, если строка пул уже содержит строки с таким же значением, как Строка от args0.
  2. Если пул содержит такую ​​ссылку на String, он будет возвращен, если не будет создан новый String с тем же значением, что и args0, который будет помещен в ссылку пула на его возврат.

после

args0 и args1 все еще держат строки, используемые в командной строке, так что они отличаются от строк в бассейне.

Чтобы изменить это попробовать, может быть

args0 = args0.intern(); 
args1 = args1.intern(); 

Теперь args0 = args0.intern(); поместит «поставить» строку из args0 в обновлении пула args0 удерживать эту строку.После args1 = args1.intern(); стажер увидит, что пул содержит ту же строку (ранее размещенную с args0.intern()), поэтому просто вернет ссылку на нее и сохранит ее под args1.

Теперь if(args0 == args1) должен быть true, потому что обе ссылки содержат один и тот же объект String.

0

Строки неизменны и его методы всегда возвращают измененный String:

args0 = args0.intern(); 
args1 = args1.intern(); 
Смежные вопросы