Разница между различными строками сравнения в Java - PullRequest
2 голосов
/ 14 апреля 2010

Есть ли разница между ними?

if(myString.equals("")){

}

if(myString.equals(null)){

}

if(myString == ""){

}

У меня есть строка, я не знаю, пустая она или имеет несколько пустых пространств. Я просто не хочу останавливать ее для записи в базу данных, если она недопустима (если она пуста или с некоторыми пробелами).

Ответы [ 8 ]

10 голосов
/ 14 апреля 2010

Каждый из ваших примеров отличается друг от друга.

  1. Первое простое сравнение, чтобы увидеть, пусто ли myString (строка без символов)
  2. Второе всегда либо ложно, либо NullPointerException
  3. Третий проверяет, ссылается ли переменная myString на пустую строковую константу. Это будет верно, если переменная явно инициализируется из пустой строковой константы, или , если переменная инициализируется некоторой «сгенерированной» пустой строкой (например, new StringBuilder().toString()), а затем явно добавляется к константе бассейн с intern().

Как указано в комментарии, первый пример может также выдавать NullPointerException, но не третий.

5 голосов
/ 14 апреля 2010

Чтобы добиться того, что вы хотите, напишите:

if (!myString.trim().equals("")) {
    // write to database
}

или если есть вероятность, что myString может быть null:

if (myString != null && !myString.trim().equals("")) {
    // write to database
}
3 голосов
/ 14 апреля 2010

Да, есть.

First вернет true, если ваша строка пуста.

Секунда всегда будет возвращать ложь.

Третий вернет true, если ваша строка определена именно так:

String myString = "";

Обратите внимание, что это не то же самое, что и в случае 1! Первый проверяет равенство значений, а второй - идентичность.

    String myString = "";
    String myOtherString = new String(myString);

    assert myString == "";
    assert myOtherString.equals("");
    assert myOtherString != "";

Итог:

  • использовать первый случай для сравнения строк,
  • используйте myString == null для нулевых тестов,
  • никогда не используйте третий!
2 голосов
/ 14 апреля 2010

Пайтон добавил правильный ответ. чтобы выяснить, что не так с вашими попытками:

//true if myString is the empty string. will fail on " "  
if(myString.equals("")){

}

//always false, or fails
//if myString is null, you'll get a NullPointerException
//if it isn't, you'll get false
if(myString.equals(null)){

}

//a bad way to do things with unexpected results.
//when dealing with objects, == is true when each are the same object.
//two different objects that have the same content or value (e.g. clones)
//will return false using this technique
if(myString == ""){

}
1 голос
/ 14 апреля 2010

Если вы не хотите зависеть от внешних библиотек, вы можете использовать класс StringUtils Apache Commons, который предоставляет метод с именем "isNotBlank ()", который, кажется, идеально соответствует вашим потребностям:

Checks if a String is not empty (""), not null and not whitespace only.

StringUtils.isNotBlank(null)      = false
StringUtils.isNotBlank("")        = false
StringUtils.isNotBlank(" ")       = false
StringUtils.isNotBlank("bob")     = true
StringUtils.isNotBlank("  bob  ") = true

См. http://commons.apache.org/lang/api/org/apache/commons/lang/StringUtils.html#isBlank%28java.lang.CharSequence%29

0 голосов
/ 14 апреля 2010

Просто используйте Apache Commons StringUtils.isBlank ()

РЕДАКТИРОВАТЬ: Чтобы достичь того, что вы хотите, используя метод @ zim2001, сделайте следующее:

if ( StringUtils.isNotBlank(myString) ) { 
    // write to database 
} 

Это намного легче читать, чем текущий принятый ответ. (Но, пожалуйста, смотрите другие посты здесь, чтобы узнать все тонкости работы со String.)

0 голосов
/ 14 апреля 2010

Все они разные. Предполагая, что myString не нуль,

  1. Вернет true, если строка, на которую ссылается myString, представляет пустую строку
  2. Всегда будет возвращать false
  3. Вернет true, если myString ссылается на тот же экземпляр String как "". Это вполне может быть правдой в вашей программе, но вполне может быть и ложным.
0 голосов
/ 14 апреля 2010

Строка в Java это просто еще один объект. Ваше первое сравнение является наиболее правильным. Он сравнивает myString с пробелом и возвращает true, если ваша строка также пуста (""). Второе сравнение всегда ложно. В-третьих, он сравнивает равенство объектов (воспринимает это как сравнение адреса объекта). Я думаю, что всегда будет возвращать false, если ваша строка не является String myString = "" (не уверен в этом).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...