자바 에서 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=
쉽게 말 하면-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 유형 값 과 같은 판단 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 부 탁 드 리 겠 습 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.