Должен ли я использовать 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("").