Java Integer.ValueOf()에 대한 이해

4076 단어 JavaInteger.ValueOf()
본 고 는 Integer.ValueOf()에 대한 이해 로 여러분 께 공유 합 니 다.

 이 문 제 는 어떤 사람 이 풀 었 을 수도 있 고 맞 출 수도 있 지만 그 중의 이 치 를 너 는 반드시 이해 하지 못 한다.여기 서 큰 소 가 지나 가 고 흰 둥 이 는 남아 서 함께 공부한다.

먼저 선택 형 A,Integer i01=59 를 분석 하여 포장 하 는 과정 입 니 다.i01==i02 를 비교 하 는 과정 에서 오른쪽 이 정형 이 고 상 자 를 뜯 는 동작 이 발생 했 기 때문에 비교 할 만 한 가치 가 있 기 때문에 true 로 돌 아 왔 습 니 다.
여기 서 Integer a=59,Integer b=59 를 꺼 내 면 어떤 상황 이 벌 어 질 까?포장 과 분해 로 보면 true 이 고 대상 으로 보면 false 이다.결정 하지 못 할 때 소스 코드 를 봐 야 한다.

/**
   * 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() {}
  }
이 클래스 는 Integer 클래스 의 정적 내부 클래스 입 니 다.그 중의 정적 코드 블록 은 클래스 를 불 러 올 때-127-128 이 숫자 들 을 만 들 고 저장 하 며 그들의 인용 을 모두 Cache 배열 에 저장 합 니 다.
따라서 Integer 성명 으로 변 수 를 초기 화 할 때 할당 한 크기 가-128 에서 127 사이 인지 판단 합 니 다.만약 에 있 으 면 정적 캐 시 에 있 는 공간 을 이용 하여 해당 cache 배열 에 대응 하 는 인용 을 되 돌려 주 고 실행 스 택 에 저장 하 며 메모리 를 다시 열지 않 습 니 다.
여기 서 아 시 겠 죠?Integer a=59,Integer b=59 는 true,Integer a=300,Integer b=300 은 판단 이 끝나 면 new 에서 새로운 대상 이 나 오기 때문에 false 로 돌아 갑 니 다.

B 옵션 을 분석 하 겠 습 니 다.Value 코드 를 먼저 보 겠 습 니 다.

* @param i an {@code int} value.
   * @return an {@code Integer} instance representing {@code i}.
   * @since 1.5
   */
  public static Integer valueOf(int i) {
    if (i >= IntegerCache.low && i <= IntegerCache.high)
      return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
위의 것 과 마찬가지 로 int 가 들 어간 후에 먼저 판단 하고-128-127 사이 에 인용 을 되 돌려 줍 니 다.그렇지 않 으 면 new 에서 대상 이 나 옵 니 다.그래서 B 옵션 은 트 루 로 돌아 갑 니 다.

C 옵션 i03 은 Cache 배열 의 인용 을 되 돌려 주 고,i04 는 쌓 인 대상 의 인용 을 되 돌려 주 므 로 false 를 되 돌려 줍 니 다.

 System.out.println(i02== i04) i02 는 정형 변수 이 고 i04 는 인용 입 니 다.여 기 는 패 키 지 를 풀 때 도 사 용 됩 니 다.가상 기 회 는 i04 가 가리 키 는 데 이 터 를 정형 변수 로 분해 한 다음 에 비교 하기 때문에 수치,59==59 를 비교 하여 true 로 되 돌려 줍 니 다.
자바 Integer.ValueOf()에 대해 알 고 있 는 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 자바 Integer.ValueOf()내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 부 탁 드 리 겠 습 니 다!

좋은 웹페이지 즐겨찾기