답변:
""는 실제 문자열이지만 빈 문자열입니다.
그러나 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)이 발생할 수 있으므로주의하십시오.
intern
가 만료되었습니다. weblogs.java.net/blog/enicholas/archive/2006/06/…
String a = null
있고 인쇄 할 때 String과 같은 문자열을 추가 하면 null이 문자열이 아닌 경우 a+= "example"
왜 표시 nullexample
됩니까?
"num: " + 20
당신에게 문자열을 제공합니다 "num: 20"
. 이것이 20
문자열 이라는 것을 의미합니까 ? (아니, 20
숫자입니다). 같은 경우 null
: 문자열이 아니지만 추가하려고하면 문자열로 변환 할 수 있습니다.
문자열은 객체이며 null 일 수 있습니다
null은 문자열 객체가 인스턴스화되지 않았 음을 의미합니다.
""는 "aaa"와 같은 인스턴스화 된 객체 문자열의 실제 값입니다.
다음은 그 점을 명확히 할 수있는 링크입니다. http://download.oracle.com/javase/tutorial/java/concepts/object.html
if (mp==null){do something}
. 예 : .
둘 사이에는 상당한 차이가 있습니다. 빈 문자열 ""
은 "문자가없는 문자열"입니다. 길이가 잘 정의 된 실제 문자열입니다. 모든 표준 문자열 연산은 빈 문자열에 잘 정의되어 있습니다. 소문자로 변환하거나 일부 문자의 색인을 검색 할 수 있습니다. 널 문자열 null
은 "문자열 없음"입니다. 문자열이 아니기 때문에 길이가 없습니다. 표준 문자열 작업을 null 문자열에 적용하려고하면 NullPointerException
런타임에 가 발생 합니다.
에 여기 a is an Object
만 b(null)
입니다 하지 개체가 널 참조입니다
System.out.println(a instanceof Object); // true
System.out.println(b instanceof Object); // false
여기 내 비슷한 대답입니다
a
와 b
참조입니다. a
인스턴스화 된 객체에 대한 참조입니다. b
는 인스턴스화 된 객체가없는 참조이므로 "널 참조"라는 용어입니다.
Java에서는 할당 된 참조 유형에 값null
이 전혀 없습니다 . 지정된 문자열 ""
에는 값이 있습니다. 빈 문자열은 문자가없는 문자열입니다. 변수가 할당되면 null
모든 종류, 문자열 또는 기타 기본 개체가 없음을 의미합니다.
"" 와 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());
}
}
}
String s=null;
문자열이 null로 초기화되지 않았습니다. 문자열 연산이 시도되면 null 포인터 예외가 발생할 수 있습니다.
String t="null";
t = "xyz"와 같은 값 문자열 "null"을 가진 문자열 리터럴입니다. 널 포인터를 던지지 않습니다.
String u="";
빈 문자열이므로 null 포인터를 throw하지 않습니다.
이 개념은 수학에서 더 잘 이해할 수 있습니다. 7/0과 같은 계산기를 사용하여 0이 아닌 숫자를 0으로 나누려고 시도한 적이 있습니까? :이 뭔가처럼 보이는 결과를 얻을 것이다 undefined
, not a number
, null
등의 작업이 몇 가지 이유를 들어 불가능하다는 것을이 수단 (하자 다른 날 논의 될 그 이유를두고).
이제 이것을 수행하십시오 : 0/7. 결과는 0입니다. 이것은 연산이 가능하고 실행될 수 있음을 의미하지만, 나눗셈 뒤에 아무것도 남지 않기 때문에 답은 0입니다. 유효한 출력이 있고 그 출력이 0입니다.
첫 번째 예에서는 출력이 유효하지 않았을뿐만 아니라 작업을 실행할 수 없었습니다. 이것은 null
Java의 문자열 과 유사합니다 . 두 번째 예는 empty
문자열 과 유사 합니다.
당신이 쓸 때
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
빈 문자열과 빈 문자열의 차이점 예를 들어, x라는 변수가 있습니다. JS로 작성하면
var x = "";
이는 빈 문자열 (길이는 0) 인 값을 할당했음을 의미합니다. 실제로 이것은 무언가와 같지만 아무것도 느끼지 않습니다 :) 반면에,
var y = null;
이것은 선언 할 때 null을 y로 쓰면서 명확하게 말한 값을 y에 할당하지 않았 음을 의미합니다. y.length를 쓰면; y에 할당 된 값이없고 결과적으로 y의 길이를 읽을 수 없음을 나타내는 오류가 발생합니다.
이 이미지는 차이점을 이해하는 데 도움이 될 수 있습니다.
ProgrammerHumor 에서 이미지가 수집되었습니다.
"저는 이것을 10 억 달러의 실수라고 부릅니다. 1965 년에 null 참조의 발명이었습니다"-https: //ko.wikipedia.org/wiki/Tony_Hoare
실제 세계와 관련하여 둘 다 동일하다고 가정 할 수 있습니다. 여기에 다른 사람들이 설명하는 것처럼 둘 사이의 차이점을 만드는 프로그래밍 언어의 구문 일뿐입니다. 이것은 단순히 문자열 변수에 무언가가 있는지 확인 / 비교할 때와 같은 오버 헤드를 생성합니다. 먼저 null이 아닌지 확인한 다음 실제 문자열 비교, 즉 두 비교를 확인해야합니다. 이것은 모든 문자열 비교에 대한 처리 능력의 낭비입니다.
Objects.equals ()는 .equals ()를 호출하기 전에 null을 확인합니다.
b.equals(a)
하지만==
다른 방법으로 "작동하지 않습니다"로 문자열 비교 에는 사용하지 마십시오 .null
(빈 문자열과 다른 값을""
유효한 문자열 인스턴스) 수 결코 그것을 바탕으로 호출하는 방법이 없습니다. "알려진 널이 아닌"(보통 상수 값 또는 리터럴)을 같음의 왼쪽에 배치하는 것은 "요다 조건부"또는 일부입니다.