Как проверить, равна ли моя строка нулю? - PullRequest
157 голосов
/ 08 апреля 2010

Я хочу выполнить какое-то действие ТОЛЬКО ЕСЛИ моя строка имеет значимое значение. Итак, я попробовал это.

if (!myString.equals("")) {
doSomething
}

и это

if (!myString.equals(null)) {
doSomething
}

и это

if ( (!myString.equals("")) && (!myString.equals(null))) {
doSomething
}

и это

if ( (!myString.equals("")) && (myString!=null)) {
doSomething
}

и это

if ( myString.length()>0) {
doSomething
}

И во всех случаях моя программа doSomething, несмотря на то, что моя строка пуста. Это равно null. Так что же с этим не так?

ДОБАВЛЕНО:

Я нашел причину проблемы. Переменная была объявлена ​​как строка, и, как следствие, null, присвоенный этой переменной, был преобразован в "null"! Итак, if (!myString.equals("null")) работает.

Ответы [ 26 ]

4 голосов
/ 08 июля 2013

Каждый раз, когда мне приходится иметь дело со строками (почти каждый раз), я останавливаюсь и задаюсь вопросом, какой способ действительно является самым быстрым способом проверки на наличие пустой строки. Конечно, проверка string.Length == 0 должна быть самой быстрой, поскольку Length - это свойство, и не должно быть никакой обработки, кроме получения значения свойства. Но потом я спрашиваю себя, почему там String.Empty? Я должен сказать, что проверка на String.Empty должна выполняться быстрее, чем на длину. Ну, я решил проверить это. Я написал небольшое приложение для консоли Windows, которое сообщает мне, сколько времени потребуется, чтобы выполнить определенную проверку на 10 миллионов повторений. Я проверил 3 разных строки: пустую строку, пустую строку и строку "". Я использовал 5 разных методов: String.IsNullOrEmpty (), str == null, str == null || str == String.Empty, str == null || str == "", str == null || str.length == 0. Ниже приведены результаты:

String.IsNullOrEmpty()
NULL = 62 milliseconds
Empty = 46 milliseconds
"" = 46 milliseconds

str == null
NULL = 31 milliseconds
Empty = 46 milliseconds
"" = 31 milliseconds

str == null || str == String.Empty
NULL = 46 milliseconds
Empty = 62 milliseconds
"" = 359 milliseconds

str == null || str == ""
NULL = 46 milliseconds
Empty = 343 milliseconds
"" = 78 milliseconds

str == null || str.length == 0
NULL = 31 milliseconds
Empty = 63 milliseconds
"" = 62 milliseconds

Согласно этим результатам, в среднем проверка на str == null является самой быстрой, но не всегда дает то, что мы ищем. if str = String.Empty или str = "", это приводит к ложному. Тогда у вас есть 2, которые связаны на втором месте: String.IsNullOrEmpty() и str == null || str.length == 0. Поскольку String.IsNullOrEmpty() выглядит лучше и его легче (и быстрее) писать, я бы рекомендовал использовать его поверх другого решения.

3 голосов
/ 14 октября 2016

Я использовал StringUtil.isBlank(string)

Проверяет, является ли строка пустой: ноль, emtpy или только пробел. Так что этот пока лучший

Вот оригинальный метод из документов

/**
    * Tests if a string is blank: null, emtpy, or only whitespace (" ", \r\n, \t, etc)
    * @param string string to test
    * @return if string is blank
    */
    public static boolean isBlank(String string) {
        if (string == null || string.length() == 0)
            return true;

        int l = string.length();
        for (int i = 0; i < l; i++) {
            if (!StringUtil.isWhitespace(string.codePointAt(i)))
                return false;
        }
        return true;
    } 
3 голосов
/ 08 апреля 2010

Я бы сделал что-то вроде этого:

( myString != null && myString.length() > 0 )
    ? doSomething() : System.out.println("Non valid String");
  • Проверка на нулевые проверки, содержит ли myString экземпляр String.
  • length () возвращает длину и эквивалентнаto равно ("").
  • Проверка, является ли myString нулевым первым, исключит исключение NullPointerException.
2 голосов
/ 10 февраля 2017

Хорошо, вот как типы данных работают в Java. (Вы должны извинить мой английский, я, вероятно, не использую правильный словарный запас. Вы должны различать два из них. Базовые типы данных и нормальные типы данных. Базовые типы данных в значительной степени составляют все, что существует. Например, есть все числа, char, boolean и т. Д. Обычные типы данных или сложные типы данных - это все остальное. String - это массив символов, поэтому сложный тип данных.

Каждая переменная, которую вы создаете, фактически является указателем на значение в вашей памяти. Например:

String s = new String("This is just a test");

переменная "s" НЕ содержит строку. Это указатель. Этот указатель указывает на переменную в вашей памяти. Когда вы вызываете System.out.println(anyObject), вызывается метод toString() этого объекта. Если он не переопределил toString из объекта, он напечатает указатель. Например:

public class Foo{
    public static void main(String[] args) {
        Foo f = new Foo();
        System.out.println(f);
    }
}

>>>>
>>>>
>>>>Foo@330bedb4

Все, что стоит за "@", это указатель. Это работает только для сложных типов данных. Примитивные типы данных ПРЯМО сохраняются в своем указателе. Так что на самом деле указатель отсутствует, а значения сохраняются напрямую.

Например:

int i = 123;

Я НЕ храню указатель в этом случае. я буду хранить целочисленное значение 123 (в байтах ofc).

Хорошо, давайте вернемся к оператору ==. Он всегда сравнивает указатель, а не содержимое, сохраненное на месте указателя в памяти.

* * Пример тысяча двадцать-один: * * 1 022
String s1 = new String("Hallo");
String s2 = new String("Hallo");

System.out.println(s1 == s2);

>>>>> false

Обе строки имеют разные указатели. String.equals (String other), однако, сравнивает содержимое. Вы можете сравнивать примитивные типы данных с оператором '==', поскольку указатель двух разных объектов с одинаковым содержимым одинаков.

Ноль будет означать, что указатель пуст. Пустой примитивный тип данных по умолчанию равен 0 (для чисел). Однако для любого сложного объекта значение NULL означает, что этот объект не существует.

Привет

2 голосов
/ 19 октября 2017

Для меня лучшая проверка, имеет ли строка какое-либо значимое содержимое в Java, это:

string != null && !string.trim().isEmpty()

Сначала вы проверяете, является ли строка null, чтобы избежать NullPointerException, а затем вы обрезаете все пробелы, чтобы избежать проверки строк, которые имеют только пробелы, и, наконец, вы проверяете, является ли усеченная строка не пустой, т.е. имеет длину 0.

2 голосов
/ 08 апреля 2010

Это должно работать:

if (myString != null && !myString.equals(""))
    doSomething
}

Если нет, то, вероятно, myString имеет значение, которое вы не ожидаете. Попробуйте напечатать это так:

System.out.println("+" + myString + "+");

Использование символов «+» для окружения строки покажет вам, есть ли там дополнительный пробел, который вы не учитываете.

2 голосов
/ 09 мая 2012

if(str.isEmpty() || str==null){ do whatever you want }

1 голос
/ 25 мая 2016

В Android вы можете проверить это с помощью служебного метода isEmpty из TextUtils,

public static boolean isEmpty(CharSequence str) {
    return str == null || str.length() == 0;
}

isEmpty(CharSequence str) метод проверки обоих условий, для null и длины.

1 голос
/ 25 сентября 2015

Я предпочитаю использовать:

if(!StringUtils.isBlank(myString)) { // checks if myString is whitespace, empty, or null
    // do something
}

Чтение StringUtils.isBlank () против String.isEmpty () .

1 голос
/ 27 сентября 2014

У меня была эта проблема в Android, и я использую этот способ (работа для меня):

String test = null;
if(test == "null"){
// Do work
}

Но в Java-коде я использую:

String test = null;
if(test == null){
// Do work
}

А:

private Integer compareDateStrings(BeanToDoTask arg0, BeanToDoTask arg1, String strProperty) {
    String strDate0 = BeanUtils.getProperty(arg0, strProperty);_logger.debug("strDate0 = " + strDate0);
    String strDate1 = BeanUtils.getProperty(arg1, strProperty);_logger.debug("strDate1 = " + strDate1);
    return compareDateStrings(strDate0, strDate1);
}

private Integer compareDateStrings(String strDate0, String strDate1) {
    int cmp = 0;
    if (isEmpty(strDate0)) {
        if (isNotEmpty(strDate1)) {
            cmp = -1;
        } else {
            cmp = 0;
        }
    } else if (isEmpty(strDate1)) {
        cmp = 1;
    } else {
        cmp = strDate0.compareTo(strDate1);
    }
    return cmp;
}

private boolean isEmpty(String str) {
    return str == null || str.isEmpty();
}
private boolean isNotEmpty(String str) {
    return !isEmpty(str);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...