string.isEmpty () 또는“”.equals (string)을 사용해야합니까?


171

제목은 기본적으로 모든 것을 말합니다. 나는 보통 이것을 함께 테스트 string == null하고 있으므로 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;


26
isEmpty()Java 6+ 전용 임을 명심하십시오 .
ColinD

1
도우미, Util.String.hasValue (String s) 메소드를 사용하여 모든 경우를 처리하기 위해 null, 공허함 및 공백을 검사 할 수 있습니다.
Cloudanger

5
@ColinD 문제가 없을 것입니다. J2SE 5.0은 얼마 전에 서비스 종료 수명을 완료했습니다.
Tom Hawtin-tackline

1
고려해야 할 또 다른 사항은 "".equals ()는 Object를 인수로 사용하므로 인수 유형이 String에서 다른 것으로 변경되는 경우 컴파일러 오류가 발생하지 않는다는 것입니다.
Paul Jackson

답변:


251

가장 큰 장점은 null 검사 가 필요"".equals(s) 하지 않다는 것입니다 ( 인수를 확인하고 null 인 경우 반환 합니다). null 이 걱정되지 않거나 다른 방법으로 확인하는 경우 분명히 사용합니다 . 그것은 당신이 점검하고있는 것을 정확하게 보여줍니다. 비어 있는지 아닌지, 빈 문자열과 같은지 여부 를 걱정합니다.equalsfalsess.isEmpty()s


29
설명 감사합니다. 이제 str.equals ( "")보다 "".equals (str)을 선호하는 이유를 알고 있습니다! 나는 왜 다른 사람들이 이것을 자주 사용하는지 궁금해했지만 null 값을 고려하지 않았습니다. Great :-)
Peter Wippermann

10
IMHO null 값에 대해 조건이 참이어야한다고 가정하므로 위의 예에서는 여전히 널 검사가 필요합니다. s == null || "".equals (s)
mkorpela

5
경우 Master.Aurora @ 아니, getValue()널 (null)을 반환, 당신은 NullPointerException이 얻을 것이다 toString()불렀다
ataulm

12
@RenniePet 그것은 마술과 관련된 것이 아닙니다. snull 인 경우 , 메소드를 호출 할 수 없습니다. null입니다. ""절대 null이되지 않으므로 안전하게 메소드를 호출 할 수 equals()있으며 인수가 null 인 경우를 처리 할 수 ​​있습니다.
Michael Mrozek

5
성능에 대한 참고 사항 : isEmpty()프라이빗 배열의 내부 길이를 확인하는 반면 equals(Object anObject)훨씬 더 많이 수행합니다 (예 : 점검 instanceof). 성능면에서는 isEmpty()일반적으로 더 빠릅니다.
Turing85

82

String.equals("")실제로는 isEmpty()전화 보다 조금 느립니다 . 문자열은 변경할 수 없으므로 문자열은 생성자에서 초기화 된 카운트 변수를 저장합니다.

isEmpty() equals는 count 변수를 0과 비교하지만 equals는 유형, 문자열 길이를 확인한 다음 크기가 일치하는 경우 비교를 위해 문자열을 반복합니다.

따라서 귀하의 질문에 대답하기 위해 isEmpty()실제로 훨씬 덜 할 것입니다! 그리고 그것은 좋은 것입니다.


3
이 경우에는 차이가 적용되지 않는다고 생각합니다. 크기가 일치하지 않기 때문에 (문자열이 실제로 비어 있고 반복 할 문자가없는 한) 비교를 위해 문자열을 반복 할 수 없습니다.
Michael Mrozek

2
사실이지만 같으면 참조 검사가 먼저 수행되어 동일한 객체인지, 인스턴스인지, String으로 캐스트, 길이 검사 및 마지막으로 반복인지 확인합니다. 두 문자열이 모두 비어 있으면 간단한 참조 검사 일뿐입니다.
David Young

String 클래스에 소스 코드를 사용할 수 있습니다 java2s.com/Open-Source/Java-Document/6.0-JDK-Core/lang/java/…
David Young

1
@ 데이빗 데드 링크; 여기에 라이브 하나 년대 docjar.com/html/api/java/lang/String.java.html#1011
매트 볼

17

언급 한 다른 문제 외에도 고려해야 할 한 가지는 isEmpty()1.6에 도입 된 것이므로이를 사용하면 Java 1.5 이하에서 코드를 실행할 수 없습니다.


4
그것은 저에게 전혀 관심사가 아닙니다.
매트 볼

1
또한이 답변은 6 년 전입니다. 아무도 더 이상 Java 1.5와 같은 고대의 것을 사용하지 않기를 바랍니다.
Misha Nasledov

1
실제로 Java 버전을 업그레이드 할 때 깨질 수있는 많은 것들이 있습니다. 큰 서버에서 실행되는 백엔드 응용 프로그램에는 덜 중요하지만 클라이언트 응용 프로그램에는 중요합니다. 그래픽 라이브러리 및 가비지 콜렉션 전략은 주요 및 소규모 Java 업그레이드의 영향을받는 경우가 많습니다. 또한 클라이언트 소프트웨어는 다양한 운영 체제에서 실행되고 때로는 제한된 메모리로 실행될 수 있으므로 모든 것을 테스트 할 예산 / 자원이없는 경우가 많습니다. -예, 2017
에도

15

Apache Commons StringUtils isEmpty () 또는 isNotEmpty ()를 사용할 수 있습니다 .


1
@ 2019 그리고 우리는 여전히 이것에 대한 제 3 자 라이브러리가 필요합니다 :
Adam

2

실제로 중요하지 않습니다. "".equals(str)내 의견으로는 더 명확합니다.

isEmpty()리턴 count == 0;


47
나는 str.isEmpty()보다 더 명확 하다고 말하고 싶다 "".equals(str). 확인중인 내용으로 읽습니다. 그래도 의견은 중요합니다.
ColinD

7
일부 사람들은 NPE를 피하기 위해 "".equals (str)을 선호한다고 생각합니다. 문자열이 null이 아닌지 확인하기 때문에 개인적으로 마음에 들지 않습니다.
CoolBeans

2

성능을 테스트 할 수있는 테스터 클래스를 작성했습니다.

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 ( "") 시간의 약 절반이 걸린다는 것을 알았습니다.


이것은 유효한 마이크로 벤치 마크가 아닙니다. Caliper 또는 이와 유사한 목적으로 만들어진 벤치마킹 도구를 사용하는 것이 좋습니다 . stackoverflow.com/q/504103/139010
Matt Ball

팁 고마워! 자유 시간이 생기면 마이크로 벤치마킹을 시도하고 답변을 업데이트합니다.
conapart3
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.