300 != 300
int value = 100;
Integer a = value;
Integer b = value;
System.out.println(a + "==" + b + " ? " + (a == b));
value = 300;
a = value;
b = value;
System.out.println(a + "==" + b + " ? " + (a == b));
-----------------------------------------------------------------------------
output:
100==100 ? true
300==300 ? false
-----------------------------------------------------------------------------
decompile code:
int value = 100;
Integer a = Integer.valueOf(value);
Integer b = Integer.valueOf(value);
System.out.println((new StringBuilder()).append(a).append("==").append(b).append(" ? ").append(a == b).toString());
value = 300;
a = Integer.valueOf(value);
b = Integer.valueOf(value);
System.out.println((new StringBuilder()).append(a).append("==").append(b).append(" ? ").append(a == b).toString());
-----------------------------------------------------------------------------
JDK source:
public static Integer valueOf(int i) {
final int offset = 128;
if (i >= -128 && i <= 127) { // must cache
return IntegerCache.cache[i + offset];
}
return new Integer(i);
}
-----------------------------------------------------------------------------
원래 1.5의 box와 unboxing 기능은 가면일 뿐이고 컴파일러는 결국 1.4의 규칙으로 실현되었다. 그러나 1.5의 Integer는public static Integer value Of(int i)의 함수를 추가했고 내부에서 -128에서 127 사이의 Integer 대상에 대한 캐시를 실현했다. 그 의도와Boolean.valueOf와 마찬가지로 너무 많은 창설 대상을 피합니다.앞으로 new Integer(××)코드가 나왔습니다. 모두 Integer를 사용해야 합니다.valueOf(××)의 방식.또한 StringBuilder의 세부 사항은 우리가 주의하는 바와 같이 1.5 도입 기능은 StringBuffer의 새로운 종류와 같다. 단지StringBuilder는 라인의 안전 상황을 고려하지 않는다. 보아하니 1.5는 효율에 대한 작은 세부 사항의 최적화가 적지 않은 것 같다. 심지어 인코딩 습관에 대한 수정도 주목할 만하다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
2022년 3월 21일 TIL1. JVM & JDK JVM JRE 자바 실행 환경의 약자로 자바 프로그램을 실행하기 위한 도구들이 들어있으며 JVM이 이 안에 포함된다 JDK JRE + 개발툴 javac는 컴파일 명령어 HelloWorld.cl...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.