Почему имя класса противоречит интернированному сравнению строк с использованием "=="?
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().