먼저 코드를 살펴보겠습니다.
public class Main{ public static void main(String[] args){ Integer num1 = 100; Integer num2 = 100; Integer num3 = 200; Integer num4 = 200; '''//输出结果''' System.out.println(num1==num2); System.out.println(num3==num4); } }
결과가 어떨지 추측해 보세요.
많은 분들이 결과가 다 맞다고 생각하시겠지만 결과는 그렇지 않습니다
참
거짓
왜 이런 결과가 나오나요? 결과를 해석하기 위해 메모리를 사용하는 경우 num1과 num2는 동일한 개체를 가리키는 반면 num3과 num4는 다른 개체를 가리킵니다. 다음으로, Integer 유형의 valueof 메소드 소스 코드를 살펴보겠습니다.
public static Integer valueOf(int i) { assert IntegerCache.high >= 127; if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + 128]; return new Integer(i); }
IntegerCache 구현:
'''// IntegerCache,一个内部类,注意它的属性都是定义为static final''' private static class IntegerCache { static final int high; '''//缓存上界,暂为null''' static final Integer cache[]; '''//缓存的整型数组''' '''// 块,为什么定义为块''' static { final int low = -128; '''// 缓存下界,不可变了。只有上界可以改变''' '''// high value may be configured by property''' '''// h值,可以通过设置jdk的AutoBoxCacheMax参数调整(以下有解释),自动缓存区间设置为[-128,N]。注意区间的下界是固定''' int h = 127; if (integerCacheHighPropValue != null) { '''// Use Long.decode here to avoid invoking methods that''' '''// require Integer's autoboxing cache to be initialized''' // 通过解码integerCacheHighPropValue,而得到一个候选的上界值''' int i = Long.decode(integerCacheHighPropValue).intValue(); '''// 取较大的作为上界,但又不能大于Integer的边界MAX_VALUE''' i = Math.max(i, 127); '''// Maximum array size is Integer.MAX_VALUE''' h = Math.min(i, Integer.MAX_VALUE - -low); } high = h; '''//上界确定''' '''// 就可以创建缓存块,注意缓存数组大小''' cache = new Integer[(high - low) + 1]; // int j = low; for(int k = 0; k < cache.length; k++) cache[k] = new Integer(j++); '''// -128到high值逐一分配到缓存数组''' } private IntegerCache() {} }
이 두 코드를 보면 valueof 메소드를 통해 Integer 유형 객체를 생성할 때 값 범위가 [- 128,127], 값이 이 범위에 있으면 포인터는 IntegerCache.cache에 이미 존재하는 개체 참조를 가리킵니다. 값이 이 범위를 초과하면 새 개체가 생성됩니다.
한 가지 주의할 점은 모든 유형이 이 범위에 포함되는 것은 아니라는 점입니다. Double 유형을 살펴보세요.
public class Main{ public static void main(String[] args){ Double i1 = 100.0; Double i2 = 100.0; Double i3 = 200.0; Double i4 = 200.0; System.out.println(i1==i2); System.out.println(i3==i4); } }
마지막으로 출력 결과:
false
false
이 결과에 대한 구체적인 이유는 소스 코드에서 Integer와 다른 Double valueof 메소드의 구현을 살펴볼 수 있습니다. valueof 메소드는 특정 범위 내에서 정수 값의 개수가 제한되어 있지만 부동 소수점 숫자는 그렇지 않기 때문입니다.
Integer, Short, Byte, Character 및 Long 클래스의 valueOf 메소드 구현은 유사합니다.
Double과 Float의 valueOf 메소드 구현은 유사합니다.
하나를 풀다운하면 Boolean 유형의 결과가 True 또는 False 두 개가 됩니다. 소스 코드를 직접 보면
public static Boolean valueOf(boolean b) { return (b ? TRUE : FALSE); }
이고 TRUE와 FALSE는 다음과 같이 정의됩니다.
public static final Boolean TRUE = new Boolean(true); '''/** ''' '''* The <code>Boolean</code> object corresponding to the primitive ''' '''* value <code>false</code>. ''' '''*/''' public static final Boolean FALSE = new Boolean(false);
위 내용은 이 글의 전체 내용입니다. 모든 분들의 학습에 도움이 되기를 바랍니다. 또한 모든 분들이 PHP 중국어 웹사이트를 지지해 주시길 바랍니다.
Java 언박싱에 대한 심층 분석과 관련된 더 많은 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!