짧은 답변
요점은 다음과 같습니다.
==
두 참조 유형 간에는 항상 참조 비교입니다.
- 자주 사용하지 않는 경우 (예 :
Integer
및 String
) equals
대신 사용하는 것이 좋습니다.
==
참조 유형과 숫자 기본 유형 사이는 항상 숫자 비교입니다.
- 참조 유형은 unboxing 변환의 대상이됩니다.
- 개봉기는
null
항상 던집니다NullPointerException
- Java에는에 대한 많은 특수 처리가 있지만
String
실제로는 기본 유형이 아닙니다.
위의 문은 주어진 유효한 Java 코드를 유지합니다. 이러한 이해를 바탕으로 귀하가 제시 한 스 니펫에 어떤 불일치도 없습니다.
긴 답변
다음은 관련 JLS 섹션입니다.
같음 연산자의 피연산자가 모두 참조 유형이거나 널 유형이면 연산은 객체 같음입니다.
이것은 다음을 설명합니다.
Integer i = null;
String str = null;
if (i == null) {
}
if (str == null) {
}
if (str == "0") {
}
두 피연산자는 모두 참조 유형 ==
이므로 참조 동일성 비교입니다.
이것은 또한 다음을 설명합니다.
System.out.println(new Integer(0) == new Integer(0));
System.out.println("X" == "x".toUpperCase());
들어 ==
숫자 평등으로, 피연산자 중 적어도 하나는 숫자 유형이어야합니다 :
항등 연산자의 피연산자가 모두 숫자 유형이거나 하나가 숫자 유형이고 다른 하나가 숫자 유형 으로 변환 가능한 경우 피연산자에 대해 2 진 숫자 승격이 수행됩니다. 승격 된 피연산자의 유형이 int
또는 long
인 경우 정수 동등성 테스트가 수행됩니다. 승격 된 유형이 float or
double`이면 부동 소수점 동등성 테스트가 수행됩니다.
이진 숫자 승격은 값 세트 변환 및 개봉 변환을 수행합니다.
이것은 다음을 설명합니다.
Integer i = null;
if (i == 0) {
}
다음은 Effective Java 2nd Edition, 항목 49 에서 발췌 한 것입니다 . 박스형 기본 형식보다 기본 형식을 선호합니다 .
요약하면, 선택할 수있을 때마다 boxed primitive보다 우선적으로 primitive를 사용하십시오. 기본 유형은 더 간단하고 빠릅니다. 박스형 프리미티브를 사용해야한다면 조심하세요! Autoboxing은 boxed primitives를 사용하는 위험은 아니지만 자세한 정도를 줄입니다. 프로그램이 두 개의 박스형 프리미티브를 ==
연산자 와 비교할 때 ID 비교를 수행합니다. 이는 거의 확실히 원하는 것이 아닙니다. 프로그램이 boxed 및 unboxed 프리미티브와 관련된 혼합 유형 계산을 수행하면 unboxing을 수행하고 프로그램이 unboxing을 수행하면 NullPointerException
. 마지막으로, 프로그램이 기본 값을 상자에 넣으면 비용이 많이 들고 불필요한 객체 생성이 발생할 수 있습니다.
제네릭과 같은 boxed primitive를 사용하는 것 외에 선택의 여지가없는 곳이 있습니다. 그렇지 않으면 boxed primitive를 사용하기로 한 결정이 정당한지 진지하게 고려해야합니다.
참고 문헌
관련 질문
관련 질문