2016-10-26 2 views
0

Я знаю, что java хранит String Literals в Common Pool и два строковых литерала, имеющих один и тот же текст, будут ссылаться на одно и то же место в Common Pool. взять под кодом:Что такое специальный случай, который делает `str1 == str2` логической ошибкой?

String str1 = "Amir"; 
String str2 = "Amir"; 

теперь оба str1 и str2 ссылаются на то же место в общем пуле. поэтому из всего, что мы знаем, мы должны использовать equals() для правильного сравнения этих двух строк и, очевидно, str1.equals(str2) будет true.

сейчас из того, что я читал here, он говорит, что значение str1 == str2 будет истинным, потому что строки имеют одинаковый адрес (звучит довольно логично), но он также утверждает, что для этого логическая ошибка.

Мой вопрос: что это за специальный случай, который может устранить проблему и непоследовательность моего кода, если я использую str1 == str2?

ответ

1

не специальных случаи, общих случаев:

String base = "Amir123"; 
String str1 = base.substring(0, 4); 
String str2 = "Amir"; 
System.out.println(str1.equals(str2)); // true 
System.out.println(str1 == str2);  // false 

Live Copy

String str1 = "Amir"; 
String am = "Am"; 
String ir = "ir"; 
String str2 = am + ir; 
System.out.println(str1.equals(str2)); // true 
System.out.println(str1 == str2);  // false 

Live Copy(спасибо JLRishe)

В принципе, закон t около any время, когда строка создается во время выполнения, а не полностью сформирована во время компиляции, по умолчанию это будет новый объект String, и поэтому не == другой эквивалент String объект.

+1

Также: http://ideone.com/NTGlRC – JLRishe

+0

yes true. даже это: http://ideone.com/jU4GAA –

Смежные вопросы