[java] 널 (null)과 비어있는 ( “”) Java 문자열의 차이점

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

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

String a = "";
String b = null;

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

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



답변

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

그러나 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)이 발생할 수 있으므로주의하십시오.


답변

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

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

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


답변

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

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

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

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


답변

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

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

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

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


답변

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


답변

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

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

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

여기 내 비슷한 대답입니다


답변

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

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