Joshua Bloch의 Effective Java , 항목 5 : "불필요한 오브젝트 작성을 피하십시오"에서 다음 코드 예제를 게시합니다.
public static void main(String[] args) {
Long sum = 0L; // uses Long, not long
for (long i = 0; i <= Integer.MAX_VALUE; i++) {
sum += i;
}
System.out.println(sum);
}
실행하는 데 43 초가 걸립니다. Long을 프리미티브로 가져 가면 6.8 초로 줄어 듭니다. 이것이 프리미티브를 사용하는 이유에 대한 증거라면.
고유 가치 평등의 부족 또한 우려됩니다 ( .equals()
에 비해 상당히 장황합니다 ==
)
biziclop의 경우 :
class Biziclop {
public static void main(String[] args) {
System.out.println(new Integer(5) == new Integer(5));
System.out.println(new Integer(500) == new Integer(500));
System.out.println(Integer.valueOf(5) == Integer.valueOf(5));
System.out.println(Integer.valueOf(500) == Integer.valueOf(500));
}
}
결과 :
false
false
true
false
편집 왜 (3)이 반환 true
되고 (4)가 반환 false
됩니까?
그것들은 두 개의 다른 객체이기 때문입니다. 0에 가장 가까운 256 개의 정수 [-128; 127]는 JVM에 의해 캐시되므로 동일한 객체를 반환합니다. 그러나이 범위를 넘어 서면 캐시되지 않으므로 새 객체가 만들어집니다. 더 복잡하게하기 위해 JLS 는 최소 256 개의 플라이 웨이트를 캐시해야합니다. JVM 구현자는 원하는 경우 더 많은 것을 추가 할 수 있습니다. 즉, 가장 가까운 1024가 캐시되어 모두 true를 반환하는 시스템에서 실행될 수 있습니다 ... #awkward