Должен ли я использовать string.isEmpty () или "" .equals (string)? - PullRequest
165 голосов
/ 23 июля 2010

Название в основном говорит обо всем.Я обычно тестирую это вместе с string == null, поэтому я не очень обеспокоен нулевым тестом.Что я должен использовать?

String s = /* whatever */;
...
if (s == null || "".equals(s))
{
    // handle some edge case here
}

или

if (s == null || s.isEmpty())
{
    // handle some edge case here
}

На этой ноте - isEmpty() вообще делает что-то кроме return this.equals(""); или return this.length() == 0;?

Ответы [ 6 ]

244 голосов
/ 23 июля 2010

Основным преимуществом "".equals(s) является то, что вам не нужно проверка нуля (equals проверит свой аргумент и вернет false, если он нулевой), который вам, кажется, не важен , Если вы не беспокоитесь о том, что s равно нулю (или проверяете его другим способом), я бы определенно использовал s.isEmpty(); он показывает, что именно вы проверяете, вас волнует, является ли s пустым, а не равно ли оно пустой строке

81 голосов
/ 23 июля 2010

String.equals("") на самом деле немного медленнее, чем просто вызов isEmpty(). Строки хранят переменную count, инициализированную в конструкторе, поскольку строки являются неизменяемыми.

isEmpty() сравнивает переменную count с 0, в то время как equals проверит тип, длину строки, а затем перебирает строку для сравнения, если размеры совпадают.

Итак, чтобы ответить на ваш вопрос, isEmpty() на самом деле сделает намного меньше! и это хорошо.

17 голосов
/ 23 июля 2010

Одной вещью, которую вы можете рассмотреть, помимо других упомянутых проблем, является то, что isEmpty() был представлен в 1.6, поэтому, если вы его используете, вы не сможете запустить код на Java 1.5 или ниже.

14 голосов
/ 24 июля 2010

Вы можете использовать Apache Commons StringUtils isEmpty () или isNotEmpty ().

2 голосов
/ 31 января 2017

Я написал класс тестера, который может тестировать производительность:

public class Tester
{
    public static void main(String[] args)
    {
        String text = "";

        int loopCount = 10000000;
        long startTime, endTime, duration1, duration2;

        startTime = System.nanoTime();
        for (int i = 0; i < loopCount; i++) {
            text.equals("");
        }
        endTime = System.nanoTime();
        duration1 = endTime - startTime;
        System.out.println(".equals(\"\") duration " +": \t" + duration1);

        startTime = System.nanoTime();
        for (int i = 0; i < loopCount; i++) {
            text.isEmpty();
        }
        endTime = System.nanoTime();
        duration2 = endTime - startTime;
        System.out.println(".isEmpty() duration "+": \t\t" + duration2);

        System.out.println("isEmpty() to equals(\"\") ratio: " + ((float)duration2 / (float)duration1));
    }
}

Я обнаружил, что использование .isEmpty () занимает примерно половину времени .equals ("").

2 голосов
/ 23 июля 2010

Это не имеет значения. "".equals(str) более понятен на мой взгляд.

isEmpty() возвращает count == 0;

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