널 (null)과 비어있는 ( "") Java 문자열의 차이점


151

null""(빈 문자열) 의 차이점은 무엇입니까 ?

간단한 코드를 작성했습니다.

String a = "";
String b = null;

System.out.println(a == b); // false
System.out.println(a.equals(b)); // false

두 문은 모두을 반환 false합니다. 나는 그들 사이의 실제 차이점을 찾을 수없는 것 같습니다.


6
와 비교 b.equals(a)하지만 ==다른 방법으로 "작동하지 않습니다"로 문자열 비교 에는 사용하지 마십시오 . null(빈 문자열과 다른 값을 ""유효한 문자열 인스턴스) 수 결코 그것을 바탕으로 호출하는 방법이 없습니다. "알려진 널이 아닌"(보통 상수 값 또는 리터럴)을 같음의 왼쪽에 배치하는 것은 "요다 조건부"또는 일부입니다.

답변:


220

""는 실제 문자열이지만 빈 문자열입니다.

그러나 null은 String 변수가 아무것도 가리 키지 않음을 의미합니다.

a==b ""및 null이 메모리에서 동일한 공간을 차지하지 않기 때문에 false를 반환합니다. 즉, 변수가 동일한 객체를 가리 키지 않습니다.

a.equals(b) ""는 null이 아니므로 false를 반환합니다.

차이점은 ""는 실제 문자열이므로 다음과 같이 메소드 또는 함수를 계속 호출 할 수 있습니다.

a.length()

a.substring(0, 1)

등등.

b와 같이 String이 null이면 Java는 NullPointerException호출을 시도하면 a를 던집니다 .

b.length()


궁금한 차이점이 == 대 같으면 다음과 같습니다.

== 내가 간 것처럼 참조를 비교

String a = new String("");
String b = new String("");
System.out.println(a==b);

두 개의 다른 객체를 할당하고 a와 b가 다른 객체를 가리 키기 때문에 false가 출력됩니다.

그러나이 a.equals(b)경우 String은 인수 String이 null이 아니고 동일한 문자 시퀀스를 나타내는 경우에만equals true를 리턴 하므로 true 를 리턴합니다 .

그러나 Java에는 문자열에 대한 특별한 경우가 있습니다.

String a = "abc";
String b = "abc";
System.out.println(a==b);

false두 개의 다른 문자열을 할당해야하기 때문에 출력은이라고 생각할 것입니다 . 실제로 Java는 리터럴 문자열 (이 예제에서 a 및 b처럼 초기화 된 문자열) 을 인턴 합니다. 따라서 == 작동 방식에 대한 오탐 (false positive)이 발생할 수 있으므로주의하십시오.


이것이 C #에도 적용됩니까? ""에서와 같이 배열은 { '\ 0'}이며 null입니다.
Cole Johnson

3
에 대한 링크 intern가 만료되었습니다. weblogs.java.net/blog/enicholas/archive/2006/06/…
Alston

따라서 null 문자열이 String a = null있고 인쇄 할 때 String과 같은 문자열을 추가 하면 null이 문자열이 아닌 경우 a+= "example"왜 표시 nullexample됩니까?
cpinamtz

@PinaGamer JavaScript를 사용하면 문자열에 문자열이 아닌 문자열을 추가 할 수 있습니다. "num: " + 20당신에게 문자열을 제공합니다 "num: 20". 이것이 20문자열 이라는 것을 의미합니까 ? (아니, 20숫자입니다). 같은 경우 null: 문자열이 아니지만 추가하려고하면 문자열로 변환 할 수 있습니다.
daboross

@Zach L : 문자열 s = null + "a"; 출력에는 nulla를 제공하지만 null.concat ( "a")는 null 포인터 예외를 제공합니다. 첫 번째 경우 null + "a"의 이유는 무엇입니까? 작동합니다.
Ved Prakash

249

이 방법으로 null과 빈 문자열의 차이점을 이해할 수도 있습니다.

null과 0 / 빈 문자열의 차이점

R. Sato의 원본 이미지 ( @raysato )


7
대단해! 나는 누군가에게 null vs empty을 설명하고 당신의 대답에 일어났습니다. 개념은 즉시 클릭했습니다.
matt.fc

14

문자열은 객체이며 null 일 수 있습니다

null은 문자열 객체가 인스턴스화되지 않았 음을 의미합니다.

""는 "aaa"와 같은 인스턴스화 된 객체 문자열의 실제 값입니다.

다음은 그 점을 명확히 할 수있는 링크입니다. http://download.oracle.com/javase/tutorial/java/concepts/object.html


"null은 문자열 객체가 인스턴스화되지 않았 음을 의미합니다"-감사합니다! 그것은 내가 많은 것을 이해하는 데 도움이됩니다. MediaPlayer 객체에서 if 문을 한 번 사용할 수 있었고 null을 사용하여 실행 중인지 여부를 확인했지만 (있는 경우 실행하는 방법으로) 왜 작동했는지 이해하지 못했지만 지금은 null을 사용하여 MediaPlayer가 인스턴스화되었는지 여부를 확인하고 있었는지 확인했습니다 if (mp==null){do something}. 예 : .
Azurespot

12

귀하의 진술에서 말하는 것은 ""는 null과 동일하지 않다는 것입니다. ""는 빈 문자열입니다. null은 할당 된 값이 없음을 의미합니다.

시도하는 것이 더 깨달을 수 있습니다.

System.out.println(a.length()); // 0
System.out.println(b.length()); // error; b is not an object

""는 여전히 문자열이므로 메서드를 호출하고 의미있는 정보를 얻을 수 있습니다. null은 빈 변수입니다. 문자 그대로 아무것도 없습니다.


9

둘 사이에는 상당한 차이가 있습니다. 빈 문자열 ""은 "문자가없는 문자열"입니다. 길이가 잘 정의 된 실제 문자열입니다. 모든 표준 문자열 연산은 빈 문자열에 잘 정의되어 있습니다. 소문자로 변환하거나 일부 문자의 색인을 검색 할 수 있습니다. 널 문자열 null은 "문자열 없음"입니다. 문자열이 아니기 때문에 길이가 없습니다. 표준 문자열 작업을 null 문자열에 적용하려고하면 NullPointerException런타임에 가 발생 합니다.


9

에 여기 a is an Objectb(null)입니다 하지 개체가 널 참조입니다

System.out.println(a instanceof Object); // true

System.out.println(b instanceof Object); // false

여기 내 비슷한 대답입니다


1
모두 ab참조입니다. a인스턴스화 된 객체에 대한 참조입니다. b는 인스턴스화 된 객체가없는 참조이므로 "널 참조"라는 용어입니다.
저의 정확한 의견 그냥

나는 -1 ;-)에 대항했다. 그러나이 답변을 명확히하고 "객체"와 null값과 객체와 변수의 차이 의 차이점을 논의하는 것이 도움이 될 것이다 .

@pst thanks :)이 질문에 비슷한 또 다른 대답이 있기 때문에 마음에

8

null 은 이름이 인스턴스화 된 객체를 참조하지 않음을 의미합니다. "" 는 빈 문자열을 의미합니다.

여기 빈 문자열이되는 일부 객체를 참조하고 있습니다. b 는 null이므로 객체를 참조하지 않습니다.


5

Java에서는 할당 된 참조 유형에 null전혀 없습니다 . 지정된 문자열 ""에는 값이 있습니다. 빈 문자열은 문자가없는 문자열입니다. 변수가 할당되면 null모든 종류, 문자열 또는 기타 기본 개체가 없음을 의미합니다.


4

""null 은 서로 다릅니다. 첫 번째는 문자열 변수 선언의 일부로 문자열 상수가 문자열 풀에 만들어졌으며 일부 메모리가 동일한 것으로 할당되었음을 의미합니다.

그러나 null 로 선언하면 방금 jvm 인스턴스화되었지만 메모리가 할당되지 않았습니다. 따라서 "" -공백 변수 로 확인하여이 객체에 액세스하려고 하면 nullpointerexception을 막을 수 없습니다. 하나의 유스 케이스를 찾으십시오.

public class StringCheck {

public static void main(String[] args) {
    // TODO Auto-generated method stub

    String s1 = "siddhartha";
    String s2 = "";
    String s3 = null;

    System.out.println("length s1 ="+s1.length());
    System.out.println("length s2 ="+s2.length());

    //this piece of code will still throw nullpointerexception . 
    if(s3 != ""){
        System.out.println("length s3 ="+s3.length());
    }
}

}


4
String s = "";
s.length();

String s = null;
s.length();

빈 문자열에 대한 참조 ""는 힙의 개체를 가리 키므로 메서드를 호출 할 수 있습니다.

그러나 가리키는 참조 null는 힙을 가리킬 객체가 없으므로을 얻을 수 있습니다 NullPointerException.


1

빈 문자열은 객체 지향 프로그래밍 언어에서 문자열 유형에 대한 null 참조가 문자열 객체를 가리 키지 않아 오류가 발생한다는 점에서 널 참조와 구별됩니다. 빈 문자열은 여전히 ​​문자열 작업을 시도 할 수있는 문자열입니다.

빈 문자열 에 대한 Wikipedia 기사에서 .


1

String s=null;

문자열이 null로 초기화되지 않았습니다. 문자열 연산이 시도되면 null 포인터 예외가 발생할 수 있습니다.

String t="null";

t = "xyz"와 같은 값 문자열 "null"을 가진 문자열 리터럴입니다. 널 포인터를 던지지 않습니다.

String u="";

빈 문자열이므로 null 포인터를 throw하지 않습니다.


0

문자열은 비어 있거나 null값을 가질 수 있습니다 . 문자열이 null인 경우 메모리의 아무것도 참조하지 않습니다. 시도하십시오 s.length()>0. 문자열이 비어 있으면 여전히 길이 0을 반환하기 때문입니다. 따라서 아무 것도 입력하지 않으면 문자열을로 등록하지 않으므로 계속 반복됩니다 null. 길이를 확인하면 루프에서 빠져 나옵니다.


0

이 개념은 수학에서 더 잘 이해할 수 있습니다. 7/0과 같은 계산기를 사용하여 0이 아닌 숫자를 0으로 나누려고 시도한 적이 있습니까? :이 뭔가처럼 보이는 결과를 얻을 것이다 undefined, not a number, null등의 작업이 몇 가지 이유를 들어 불가능하다는 것을이 수단 (하자 다른 날 논의 될 그 이유를두고).

이제 이것을 수행하십시오 : 0/7. 결과는 0입니다. 이것은 연산이 가능하고 실행될 수 있음을 의미하지만, 나눗셈 뒤에 아무것도 남지 않기 때문에 답은 0입니다. 유효한 출력이 있고 그 출력이 0입니다.

첫 번째 예에서는 출력이 유효하지 않았을뿐만 아니라 작업을 실행할 수 없었습니다. 이것은 nullJava의 문자열 과 유사합니다 . 두 번째 예는 empty문자열 과 유사 합니다.


0

당신이 쓸 때

String a = "";

이는 문자열 풀에서 값 ""을 갖는 객체 참조를 가리키는 문자열 유형의 변수 'a'가 있음을 의미합니다. variable a이 유효한 문자열 객체 참조를 보유하므로 string의 모든 메서드를 여기에 적용 할 수 있습니다.

당신이 쓸 때

String b = null;

알 수없는 참조b 를 가리키는 string 유형 의 변수가 있음을 의미합니다 . 그리고 알 수없는 참조에 대한 작업은 .NullPointerException

이제 아래 표현식을 평가 해 봅시다.

System.out.println(a == b); // false. because a and b both points to different object reference

System.out.println(a.equals(b)); // false, because the values at object reference pointed by a and b do not match.

System.out.println(b.equals(a)); // NullPointerException, because b is pointing to unknown reference and no operation is allowed

0

간단히 말해서

  • ""는 빈 문자열입니다

  • null은 빈 문자열 변수 입니다.


0

빈 문자열과 빈 문자열의 차이점 예를 들어, x라는 변수가 있습니다. JS로 작성하면

var x = "";

이는 빈 문자열 (길이는 0) 인 값을 할당했음을 의미합니다. 실제로 이것은 무언가와 같지만 아무것도 느끼지 않습니다 :) 반면에,

var y = null;

이것은 선언 할 때 null을 y로 쓰면서 명확하게 말한 값을 y에 할당하지 않았 음을 의미합니다. y.length를 쓰면; y에 할당 된 값이없고 결과적으로 y의 길이를 읽을 수 없음을 나타내는 오류가 발생합니다.


문제는 Java
Vega


0

"저는 이것을 10 억 달러의 실수라고 부릅니다. 1965 년에 null 참조의 발명이었습니다"-https: //ko.wikipedia.org/wiki/Tony_Hoare

실제 세계와 관련하여 둘 다 동일하다고 가정 할 수 있습니다. 여기에 다른 사람들이 설명하는 것처럼 둘 사이의 차이점을 만드는 프로그래밍 언어의 구문 일뿐입니다. 이것은 단순히 문자열 변수에 무언가가 있는지 확인 / 비교할 때와 같은 오버 헤드를 생성합니다. 먼저 null이 아닌지 확인한 다음 실제 문자열 비교, 즉 두 비교를 확인해야합니다. 이것은 모든 문자열 비교에 대한 처리 능력의 낭비입니다.

Objects.equals ()는 .equals ()를 호출하기 전에 null을 확인합니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.