TL은, 박사 내 의견은 단항를 사용하는 것입니다+
값 평등을 확인할 때 피연산자 중 하나에서 unboxing을 트리거하고 그렇지 않으면 단순히 수학 연산자를 사용하는 것입니다. 근거는 다음과 같습니다.
이미 언급 된 ==
에 대한 비교가 Integer
프로그래머가 원하는 것을 일반적으로하지 않고, 목표 값의 비교를하는 것입니다 정체성 비교입니다; 그래도 코드 압축, 정확성 및 속도 측면에서 가장 효율적으로 비교를 수행하는 방법에 대해 약간의 과학 을 수행했습니다.
일반적인 방법을 사용했습니다.
public boolean method1() {
Integer i1 = 7, i2 = 5;
return i1.equals( i2 );
}
public boolean method2() {
Integer i1 = 7, i2 = 5;
return i1.intValue() == i2.intValue();
}
public boolean method3() {
Integer i1 = 7, i2 = 5;
return i1.intValue() == i2;
}
public boolean method4() {
Integer i1 = 7, i2 = 5;
return i1 == +i2;
}
public boolean method5() { // obviously not what we want..
Integer i1 = 7, i2 = 5;
return i1 == i2;
}
컴파일 및 디 컴파일 후이 코드를 얻었습니다.
public boolean method1() {
Integer var1 = Integer.valueOf( 7 );
Integer var2 = Integer.valueOf( 5 );
return var1.equals( var2 );
}
public boolean method2() {
Integer var1 = Integer.valueOf( 7 );
Integer var2 = Integer.valueOf( 5 );
if ( var2.intValue() == var1.intValue() ) {
return true;
} else {
return false;
}
}
public boolean method3() {
Integer var1 = Integer.valueOf( 7 );
Integer var2 = Integer.valueOf( 5 );
if ( var2.intValue() == var1.intValue() ) {
return true;
} else {
return false;
}
}
public boolean method4() {
Integer var1 = Integer.valueOf( 7 );
Integer var2 = Integer.valueOf( 5 );
if ( var2.intValue() == var1.intValue() ) {
return true;
} else {
return false;
}
}
public boolean method5() {
Integer var1 = Integer.valueOf( 7 );
Integer var2 = Integer.valueOf( 5 );
if ( var2 == var1 ) {
return true;
} else {
return false;
}
}
쉽게 알 수 있듯이, 방법 1은 Integer.equals()
(분명히), 방법 2-4를 호출 하면 정확히 동일한 코드가 생성 되고.intValue()
나서 직접 비교합니다. 방법 5는 신원 비교를 트리거하여 잘못된 방법입니다. 값을 비교하십시오.
(예를 들어 JS에서 이미 언급했듯이) equals()
오버 헤드가 발생하기 때문에 (필요한 instanceof
캐스트와 확인되지 않은 캐스트) HotSpot이 아니기 때문에 방법 2-4는 정확히 동일한 속도로 작동합니다. 캐스트를 최적화 할 가능성이 높습니다 instanceof
.
다른 비교 연산자 (예 : <
/ >
) 와 매우 유사합니다. 사용 compareTo()
하지 않는 동안 언 박싱을 트리거 하지만 이번에는 HS에 의해 작업을 최적화 할 수 있습니다.intValue()
는 getter 방법 (최적화 후보) 할 수 있습니다.
내 의견으로는, 거의 사용되지 않는 버전 4가 가장 간결한 방법입니다. 모든 노련한 C / Java 개발자는 단항 플러스가 대부분의 경우 int
/와 동일하다는 것을 알고 .intValue()
있습니다. 일부 사람들에게는 약간의 WTF 순간 이 될 수 있습니다. 평생 동안 단항 더하기를 사용하지 않는 것), 가장 분명하고 가장 의도를 의도적으로 보여줍니다- int
피연산자 중 하나의 가치를 원한다는 것을 보여줍니다 . 다른 가치도 개봉해야합니다. 또한 i1 == i2
기본 int
값에 사용되는 정규 비교 와 가장 유사 합니다.
내 투표는 간다 i1 == +i2
& i1 > i2
에 대한 스타일의 Integer
성능 및 일관성을 이유로 모두 객체. 또한 형식 선언 이외의 것을 변경하지 않고도 코드를 프리미티브로 이식 할 수 있습니다. 명명 된 방법을 사용하는 것은 비판적 인 bigInt.add(10).multiply(-3)
스타일 과 비슷한 의미 적 노이즈를 도입하는 것처럼 보입니다 .