Java Integer.ValueOf()에 대한 이해
4076 단어 JavaInteger.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()내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 부 탁 드 리 겠 습 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.