자바 컨테이너==의 탱크 화 구덩이

*********************************************************************************************************************************************************
      오리지널 작품 은'효 풍 잔 월 xj'블 로그 에서 나 왔 습 니 다.전 재 를 환영 합 니 다.전재 할 때 반드시 출처 를 밝 혀 주 십시오(http://blog.csdn.net/xiaofengcanyuexj)。
      여러 가지 이유 로 부족 한 점 이 많 을 수 있 습 니 다.수정 을 환영 합 니 다!
*********************************************************************************************************    
    오늘 은'Effective Java'를 읽 고'기본 유형 이 포장 기본 유형 보다 낫다'고 읽 었 습 니 다.그 중에서 그 Integer 예 는 적합 하지 않다 고 생각 하여 Integer 소스 코드 를 보 니 정말 문제 가 있 었 습 니 다.적어도 제 jdk 1.7 은 문제 가 있 었 습 니 다.
     자바 는 JVM API 를 기반 으로 한 고도 로 포 장 된 언어 로 C++와 중요 한 차이 점 은 연산 자 를 다시 불 러 오 는 것 을 지원 하지 않 는 다 는 것 이다.저 는 얕 게 이해 합 니 다.기본 적 인 연산 조작+,-,*,/,=등 은 개발 자 에 게 항상 불투명 하 다 고 말 하기 때문에 모호 한 부분 에 대해 파악 하기 어렵 습 니 다.장식 기 유형,즉 일반적인 의미 의 포장 유형 에 대해 다음 과 같 습 니 다.                                                            
int(4 바이트)
Integer
byte(1 바이트)
Byte
short(2 바이트)
Short
long(8 바이트)
Long
float(4 바이트)
Float
double(8 바이트)
Double
char(2 바이트)
Character
boolean(미 정)
Boolean
        ==포장 유형 에 대해 서 는 파악 하기 어렵다.Integer 를 예 로 들 면 보통[-128,127](그 중에서 127 은 JDK 의)시스템 변수 에 달 려 있 고 구체 적 으로 다음 과 같다.
 String integerCacheHighPropValue = sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
 
    비교적 간단 하기 때문에 인 스 턴 스 코드 를 직접 올 립 니 다.
/**
 * @  : Java   
 * @authord: jin.xu
 * @version: v1.0.0
 * @see:
 * @date: 2016/1/30 11:49
 */
public class Test {

    public static void main(String[] args) {
        Integer i=127;
        Integer j=127;

        if(j==i){
            System.out.println("true");
        }else{
            System.out.println("false");
        }


        Integer k=128;
        Integer t=128;
        if(k==t){
            System.out.println("true");
        }else{
            System.out.println("false");
        }

    }
}

입력 결 과 는 다음 과 같 습 니 다:
true false
      구체 적 인 원인 은 jdk 가 JVM 이 작은 범위 의 수 치 를 캐 시 했다 고 할 수 없다 는 것 이다.예 를 들 어 int 의[-128,127](그 중에서 128 은 비교적 정확 한 답 이 아니다).new 대상 은 쌓 아 올 리 는 것 이 아니 라 상수 탱크 에서 읽 어서 자주 대상 을 만 들 지 않도록 한다.우 리 는 더미 위 에 대상 을 만 드 는 데 시스템 비용 이 들 고 풀 화 기술 은 어느 정도 에 이런 문 제 를 해결 할 수 있다 는 것 을 알 고 있다.예 를 들 어 메모리 탱크,스 레 드 탱크 등 이다.물론 jdk 와 같은 직접 수 치 를 선택 하 는 방법 도 비교적 거 칠 고 그 중의 integer CacheHigh PropValue 변 수 는 서로 다른 기계 에 대해 조정 할 수 있 기 때문이다.jdk 코드 를 직접 붙 인
 /**
     * Cache to support the object identity semantics of autoboxing for values between
     * -128 and 127 (inclusive) as required by JLS.
     *
     * The cache is initialized on first usage.  The size of the cache
     * may be controlled by the {@code -XX:AutoBoxCacheMax=<size>} option.
     * During VM initialization, java.lang.Integer.IntegerCache.high property
     * may be set and saved in the private system properties in the
     * sun.misc.VM class.
     */

    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) {
                try {
                    int i = parseInt(integerCacheHighPropValue);
                    i = Math.max(i, 127);
                    // Maximum array size is Integer.MAX_VALUE
                    h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
                } catch( NumberFormatException nfe) {
                    // If the property cannot be parsed into an int, ignore it.
                }
            }
            high = h;

            cache = new Integer[(high - low) + 1];
            int j = low;
            for(int k = 0; k < cache.length; k++)
                cache[k] = new Integer(j++);

            // range [-128, 127] must be interned (JLS7 5.1.7)
            assert IntegerCache.high >= 127;
        }

        private IntegerCache() {}
    }

     따라서 포장 유형 에 대해 서 는 수 치 를 비교 할 때 equal()또는 XXXValue()방법 을 직접 사용 하여 연산 자==을 사용 하지 않 는 것 이 좋 습 니 다.자신 이 밟 거나 피 한 구 덩이 는 다른 사람 도 밟 지 않 았 으 면 좋 겠 다.
    
     최근 여가 시간 에 소스 코드 를 보 는 습관 이 있 습 니 다.예 를 들 어 야후 는 온라인 기계 학습 을 바탕 으로 파충류 anthelion 과 dubbo 를 배 웁 니 다.
               
  
      

좋은 웹페이지 즐겨찾기