Должен ли я использовать string.isEmpty() или "".equals(string)?

Название в основном говорит все. Обычно я тестирую это вместе с 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;?

Ответ 1

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

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

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

Ответ 5

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

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

Ответ 6

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

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("").