자바 에서 Integer 형식 값 동일 판단 방법

배경
이번 주 개발 과정 에서 매우 저급한 문 제 를 만 났 습 니 다.Integer 포장 류 의 똑 같은 판단,포장 류 와 기본 데이터 유형의 차이 점 은 대부분 사람들 이 면접 에서 자주 물 어 봐 야 합 니 다.그러나 가끔 은 쓸모 없어 보 이 는 이런 것들 을 귀 찮 게 할 때 가 있 습 니 다.면접 전에 익숙해 져 야 합 니 다.블 로 거들 도 예전 에 이렇게 생각 했 지만 평소에 이론 적 인 것 을 봅 니 다.방안 을 검토 하거나 타당 성 분석 할 때 필요 합 니 다.쓸데없는 말 이 많 지 않 습 니 다.이 문 제 를 보 세 요.
사고 현장

public static void main(String[] args) {
 Integer a =127;
 Integer b = 127;
 Integer c = 128;
 Integer d = 128;
 Integer e = 129;
 Integer f = 129;

 System.out.println(a==b); //true
 System.out.println(c==d);//false
 System.out.println(e==f);//false
 System.out.println(a.equals(b));//true
 System.out.println(c.equals(d));//true
 System.out.println(e.equals(f));//true
 }
원인 을 분석 하 다
위의 예 에서 127 의 비교 사용 을 볼 수 있다==가능 하 다.128 과 129 는 안 된다.이런 상황 에서 Integer 가 어떻게 처리 하 는 지 살 펴 보 자.
Integer 클래스 를 열 어 전체 127 이라는 숫자 를 검색 해 보 세 요.왜 127 을 검색 해 야 합 니까?127 은 가능 하기 때문에 128 은 안 됩 니 다.Integer 는 127 에 대해 특별한 처 리 를 했 을 것 입 니 다.검색 해 보 니 이 숫자 가 모두 Integer Cache 내부 클래스 에 집중 되 어 있 는 것 을 발 견 했 습 니 다.코드 는 다음 과 같 습 니 다.

/**
 * 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() {}
 }
이 내부 클래스 의 설명 을 보십시오.
자바 의미 규범 에 따라 캐 시 는-128 에서 127(포함)범위 내 자동 포장 대상 의 초기 화 를 지원 합 니 다.
캐 시 는 처음 사용 할 때 초기 화 됩 니 다.캐 시 크기 는 옵션{@code-XX:AutoBoxCacheMax=}에서 제어 합 니 다.가상 컴퓨터 초기 화 기간 에 java.lang.Integer.Integer Cache.high 매개 변 수 는 sun.misc.VM 류 의 개인 시스템 변수 에 복사 되 어 저 장 됩 니 다.
쉽게 말 하면-128 에서 127 의 범위 내 에서 Integer 는 대상 을 만 들 지 않 고 시스템 캐 시 에 있 는 변수 데 이 터 를 직접 가 져 오 는 것 이다.
해결 하 다.
포장 류 에 대해 서 는 모두 equals 를 사용 하여 판단 하 는 것 이 좋 습 니 다.Integer 는 equals 방법 은 다음 과 같 습 니 다.

public boolean equals(Object obj) {
 if (obj instanceof Integer) {
  return value == ((Integer)obj).intValue();
 }
 return false;
 }
유형 을 판단 한 후 int 값 으로 바 꾸 어 크기 를 판단 하고 결 과 를 되 돌려 줍 니 다.
반성
일부 이론 은 평소에 있 지 않 지만 이론 에 대한 이해 가 제대로 되 지 않 고 이해 의 편차 가 나타 나 면 이런 상황 에서 발생 하 는 문 제 는 일반적으로 코드 를 찾 아 문 제 를 찾아내 기 어렵다.
총결산
자바 의 Integer 유형 값 과 같은 판단 방법 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 자바 Integer 유형 값 과 같은 판단 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 부 탁 드 리 겠 습 니 다!

좋은 웹페이지 즐겨찾기