자바 자동으로 이동식 상자 숨겨진 비밀 : 자바 시리즈 2의 기초를 통합

자동 포장기 포장을 풀고 (상세)

정적 메소드 valueOf (기본 유형) 기본 유형 -> 패키지 타입 , 등 Integer.valueOf (10)]
실시 예에있어서 xxxValue () : 포장 유형 -> 기본 유형 , 예컨대 정수 변수 .intValue 포장 등 ();

은 "구덩이"에 자동 권투와 언 박싱

이 함정을 피하기 위해 함정의 일부에 자동 복싱 및 자동 언 박싱,주의를 기울를 사용하는 경우, 우리는 어떤 소스를 포장의 다양한 유형을 참조 할 필요가있다.
정수 소스

public final class Integer extends Number implements Comparable<Integer> {
	private final int value;
	

/*这是Integer的构造方法,接受一个整型参数,Integer对象表示的int值,保存在value中*/
 public Integer(int value) {
        this.value = value;
 }
 
/*equals()方法判断的是:所代表的int型的值是否相等*/
 public boolean equals(Object obj) {
        if (obj instanceof Integer) {
            return value == ((Integer)obj).intValue();
        }
        return false;
}
 
/*返回这个Integer对象代表的int值,也就是保存在value中的值*/
 public int intValue() {
        return value;
 }
 
 /**
  * 首先会判断i是否在[IntegerCache.low,Integer.high]即[-128,127]之间
  * 如果是,直接返回Integer.cache中相应的元素
  * 否则,调用构造方法,创建一个新的Integer对象
  */
 public static Integer valueOf(int i) {
    assert IntegerCache.high >= 127;
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
 }

/**
  * 静态内部类,缓存了从[low,high]对应的Integer对象
  * low -128这个值不会被改变
  * high 默认是127,可以改变,最大不超过:Integer.MAX_VALUE - (-low) -1
  * 									 即2的31次方-(128) -1
  * cache 保存从[low,high]对象的Integer对象
 */
 private static class IntegerCache {
    static final int low = -128;
    static final int high;
    static final Integer cache[];
 
    static {
        // high value may be configured by property
        int h = 127;
        String integerCacheHighPropValue =
            sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
        if (integerCacheHighPropValue != null) {
            int i = parseInt(integerCacheHighPropValue);
            i = Math.max(i, 127); //这两行是为了一定确保h=127
            // Maximum array size is Integer.MAX_VALUE
            h = Math.min(i, Integer.MAX_VALUE - (-low) -1); //这两行是为了一定确保h=127
        }
        high = h;
 
        cache = new Integer[(high - low) + 1];
        int j = low;
        for(int k = 0; k < cache.length; k++)
            cache[k] = new Integer(j++);
    }
 
    private IntegerCache() {}
}

코드의 위의 분석을 통해 제공합니다 :

그 값이 더 이상 변경 될 수 나타낸다 없다. 1) 정수 표현 int 형의 값을 보존하는 정수 인스턴스 필드 값을 가지며, 그 전체 구성 Integer 객체를 말할 즉, 최종.

2) 정수 재기록 어떤지를 결정하기 위해 두 개의 정수 오브젝트를 비교함으로써 () 메소드 값과 같다.

3) IntegerCache는, 클래스 이름을 찾을 수 있습니다 정적 내부 클래스에 초점 : 그것은 캐시 데이터를 저장하는 데 사용됩니다. 이는 연속적인 정수 목적 보존의 배열을 갖는다.
(a) 낮음 : 데이터 버퍼의 최소 값을 나타낸다는 -128 고정된다.

(B) 고 : 최대 값 대신에 데이터 캐시는, 상기 기본 127 변경할 수있다. - (- 로우) -1,이 값을 초과하는 높은 경우, 캐시 [] 이상에 Integer.MAX_VALUE의 길이보다, 오버플로 (127)가 최대에 Integer.MAX_VALUE이며 높은 최소이다.

© 캐시 []에서 [저 높은] 고저 + 1의 길이에 대응하는 정수 객체 (요소 때문에 0 있으므로 1을 추가)을 가지고있다.

4) 통화 valueOf (INTI) 방법은 제 여부를 판정 I [저 높은] 사이 그렇다면 다중화 Integer.cache [I-LOW]. 예를 들어, Integer.valueOf (3)에 직접 창 Integer.cache [131] 경우는 i가이 범위에없는 경우, 호출 생성자는 새로운 정수 객체를 생성한다.

5)있는 intValue () 값의 직접 반환 값을 호출한다.
자동 포장을 사용할 때 그것은 3) 및 4)에 의해 발견 될 수 있고, 기본적으로는 VM은 정수 객체 [-128,127] 사이에서 다중화된다.

그림 삽입 설명 여기
그 그림에 표시된
정수 기본값이 127 -128 사이 오브젝트 캐싱, 상한치 (127)는 JVM 파라미터를 변경함으로써 변경 될 수있다. 그것은 sun.misc.VM.getSavedProperty ( "java.lang.Integer.IntegerCache.high ')에 배치되고, 파라미터
속인 JAVA 포장 및 트랩 질문 대향

또한
INT 자동 포장 해체 및 -128 ~ 127의 범위에서만 포장, 정수 범위는 두 개 이상의 반환 == false를 결정한다.

기본 데이터 유형 == (이중 등호)는 값을 비교하고, 및 포장의 유형 == (이중 등호) 오브젝트 (2)의 메모리 어드레스를 비교하는 것이다.

소스보기가 발견 된
캐시의 1.Integer 유형을 [-128,127]는 객체. 상한은 캐시 구성 JVM에 의해 변경 될 수있는
롱 (256)은 [-128,127]이다 버퍼링 2.Byte 캐시 짧은 길이
3. 캐시 (128)의 길이 캐시 캐릭터 [0,127]없는
4 플로트에는 더블 캐시 (아마 플로트가되지 않기 때문에 평등에 대한 캐시의 수의 나쁜 정확한 비교)

특히, 캐시를 사용하는 특별한주의가 필요, 새로운 방법은 개체를 생성하는 캐시에게 유일한 valueOf 메소드를 사용하지 않습니다!

가 발생 구덩이

== false로 복귀 사실 동일한 이유 범위 [-127,128]의 수를 비교하지만 1?
그림 삽입 설명 여기그림 삽입 설명 여기
위해 == 사용시 때문에 1은 기본 형식 (INT하기) 위한 비교 값 에 대한 참조 형식 그것은의 더 참조 는 새로운 밖으로의 캐시가 아닌 자연과 동일하다; 주소입니다
2, 기본값은 비교하는 참조가 동일 하지만 클래스의 많은 (가) equals 메소드 오버라이드 (override) 같은 문자열, 정수 그렇게과 비교 값이되고 ,이 경우 그 값은 비교가 같은 동일하다.
당신은 정말 ==과의 등호의 차이를 아십니까?
플러스 : 정수 범위, 새로운 비교는 == 또는 허위 사실에 해당보다는 다음 캐시를 초과 한 두 번째에 있다는 비교 (다시 때문에이 방법 동일)
그림 삽입 설명 여기
그림 삽입 설명 여기
또한 여부
초과 캐시 1.
2. 또는 새로운 패키지에서 클래스
비교에 직접적인 비교를위한 클래스 (INT)의 값에 따라 실질적으로
그림 삽입 설명 여기
그림 삽입 설명 여기
인해 타입을 자동 풀기 포장 기본형 == 패키지 유형;
참고 : == 연산이 아닌 자동으로 발생하지 않을 때 포장을 풀고, 포장의 유형을 해당 자동 포장의 기본 유형, 설명 마지막의 내용을 코드에서. '
정수 따른 자동 포장 즉 상기 D는 == 먼저 그것이 참조하여 진정한 복귀 여부를 결정하기 전에 상기
로 인한 문제는 정수 범위 (127 -128)의 기록 버퍼에 대한 질문을 얼굴 시리즈

기본 데이터 저장소 유형

방법 본 변수 스택 로컬 변수 테이블
객체 클래스 인스턴스 존재 힙
포장의 유형의 기본 데이터 형식 일 수있다 상수 풀 오브젝트에 대응하는 룩업 값 객체 자동 상수 풀의 값을 찾을 수없는 생성
JDK1있다. (7), 더미 상수 풀에 넣어 .

참고 자료

게시 81 개 원래 기사 · 원 찬양 19 · 전망 3614

추천

출처blog.csdn.net/c22cxz/article/details/104719330