Почему имя класса противоречит интернированному сравнению строк с использованием "=="?

class helloworld
{
   public static void main(String args[]) {
       String str1="hello";
       String str2="world";
       String str=str1+str2;
       str.intern();
       System.out.println(str=="helloworld");
   }
}  

о / п: ложь

После выполнения программы она выдает false, так как output.if используется equals() вместо "==" и возвращает true. Почему так?

2. В этом случае после изменения имени класса он выводит true в качестве вывода.

class main
{
   public static void main(String args[]) {
       String str1="hello";
       String str2="world";
       String str=str1+str2;
       str.intern();
       System.out.println(str=="helloworld");
  }
} 

о / р: верно

Почему возникает противоречие ч / б сравнение строк с использованием "==" с именем класса (в случае сравнения имя строки используется в качестве имени класса)?

4 ответа

Решение

Причина в том, что в первом примере строка "helloworld" уже находится в пуле строк, потому что это имя класса. Так что интернирование не добавляет ничего в пул строк. Так str не будет интернированным значением, и сравнение будет ложным.

Во втором примере str.intern() на самом деле добавляет str в пул строк, потому что "helloworld" там уже нет Затем, когда "helloworld" встречается литерал, фактически используется строковый объект, который находится в пуле строк. Это просто strтак что сравнение будет верным.

String неизменен. Вы должны использовать возвращаемое значение str.intern(), Просто звоню str.intern() и игнорирование возвращаемого значения ничего не делает.

str = str.intern();

Дополняя ответы, здесь хорошие статьи о интернете ()

Английский: https://weblogs.java.net/blog/2006/06/26/all-about-intern

Русский язык: http://habrahabr.ru/post/79913/

Строка в неизменном объекте. И как из функции intern() в соответствии с Javadoc

When the intern method is invoked, if the pool already contains a
string equal to this <code>String</code> object as determined by
the {@link #equals(Object)} method, then the string from the pool is
returned. Otherwise, this <code>String</code> object is added to the
pool and a reference to this <code>String</code> object is returned.

Таким образом, вы должны присвоить возвращаемое значение, например string = string.intern();

Что касается вашего вывода это должно быть true независимо от вашего имени класса, потому что, как упоминалось выше, оно не имеет ничего общего с вызовом intern().

Другие вопросы по тегам