EDIT
Спасибо за быстрые ответы. Пожалуйста, посмотрите, каков реальный вопрос. На этот раз я выделил это жирным шрифтом.
Я понимаю разницу между == и .equals. Так что это не мой вопрос (на самом деле я добавил для этого некоторый контекст)
<ч />
Я выполняю проверку ниже для пустых строк:
if( "" == value ) {
// is empty string
}
В прошлом при извлечении значений из базы данных или десериализации объектов из другого узла этот тест не удался , потому что два экземпляра строки действительно были различными ссылками на объекты, хотя и содержали те же данные.
Так что исправление для этих ситуаций было
if( "".equals( value ) ) {
// which returns true for all the empty strings
}
Я в порядке с этим. Это ясно понято.
Сегодня это повторилось, но меня это озадачило, потому что на этот раз это очень маленькое автономное приложение , которое вообще не использует сеть , поэтому новая строка не извлекается из базы данных и не десериализируется с другого узла.
Итак, вопрос:
При каких ДРУГИХ обстоятельствах:
"" == value // yields false
и
"".equals( value ) // yields true
Для локального автономного приложения?
Я почти уверен, что new String () не используется в коде.
И единственный способ, которым ссылка на строку может быть "", это потому, что она назначается "" непосредственно в коде (или это то, что я думал), как в:
String a = "";
String b = a;
assert "" == b ; // this is true
Каким-то образом (после прочтения кода у меня есть подсказка) были созданы две разные ссылки на пустые строковые объекты, я хотел бы знать как
Еще в строке jjnguys ответ:
Byte!
РЕДАКТИРОВАТЬ: Заключение
Я нашел причину.
После предложения jjnguy я смог взглянуть на код другими глазами.
Виновный метод: StringBuilder.toString ()
Новый объект String выделяется и инициализируется для хранения последовательности символов, представленной в данный момент этим объектом.
Дох! ...
StringBuilder b = new StringBuilder("h");
b.deleteCharAt( 0 );
System.out.println( "" == b.toString() ); // prints false
Тайна раскрыта.
Код использует StringBuilder для работы с постоянно растущей строкой. Оказывается, в какой-то момент кто-то сделал:
public void someAction( String string ) {
if( "" == string ) {
return;
}
deleteBankAccount( string );
}
и использовать
someAction( myBuilder.toString() ); // bug introduced.
p.s. Я читал слишком много CodingHorror в последнее время? Или почему я чувствую необходимость добавить сюда несколько забавных картинок с животными?