EDIT Спасибо за оперативные ответы. Посмотрите, каков настоящий вопрос. На этот раз я сделал это смело.Когда "" == s является ложным, но "". Равны (равно) равен
Я понимаю разницу между == и .equals. Таким образом, это не мой вопрос (я на самом деле добавил некоторый контекст для этого)
Я выполнение проверки ниже для пустых строк:
if("" == value) {
// is empty string
}
В последних при выборке значений из db или десериализации объектов из другого узла, этот тест не удался, поскольку два экземпляра строк были действительно различными объектными ссылками, хотя они содержали одни и те же данные.
Так что исправление для тех ситуаций, было
if("".equals(value)) {
// which returns true for all the empty strings
}
Я в порядке с этим. Это понятно.
Сегодня это произошло в очередной раз, но это меня озадачило, потому что на этот раз приложение является очень небольшой отдельного приложения, который не использует сети на всех, поэтому никакой новая строка не извлекается из базы данных, ни deserizalized от другой узел.
Так что вопрос:
В каких ДРУГИЕ обстоятельства:
"" == value // yields false
и
"".equals(value) // yields true
Для местного применения автономного?
Я уверен, новый String() не используется в коде.
И единственный способ ссылки строка может быть «», потому что это в настоящее время назначается «» непосредственно в коде (или то, что я думал), как в:
String a = "";
String b = a;
assert "" == b ; // this is true
Как-то (после прочтения кода более у меня есть ключ были созданы) два различных объектные ссылки пустой строки, я хотел бы знать, как
Больше в строке jjnguys ответа:
Byte!
EDIT: Заключение
Я нашел причину.
После предложения jjnguy я смог смотреть разными глазами на код.
Виновный метод: StringBuilder.toString()
A new String object is allocated and initialized to contain the character sequence currently represented by this object.
Doh ...
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 в последнее время? Или почему я чувствую необходимость добавить некоторые забавные фотографии животных здесь?
if (value! = Null && value.length == 0) {...}, и вы должны использовать equals потому, что == для объектов сравнивает ссылки, т. Е. Являются ли они одним и тем же объектом. Хотя во время компиляции Java находит идентичные строки и заставляет их использовать одну и ту же ссылку (строки неизменяемы), во время выполнения легко создавать пустые строки, которые имеют разные ссылки. – JeeBee
Как мой ответ предлагает ... забыть, что вы «думали». Если вы хотите проверить, имеет ли что-то то же значение, что и пустая строка, тогда используйте equals. Вы пытаетесь зависеть от компилятора, который интернирует ваши строки, что указывает Джош Блох, это не инструмент для программистов :-). Смотри ниже. – Tom
Несколько ответов теперь показывают простые манипуляции с строками, которые дают разные объекты String нулевой длины. Сети и доброта не имеют ничего общего с этими ответами. – djna