Java 중 (Integer) 127 = = (Integer) 127 과 (Integer) 129 = = (Integer) 129 표현 식 결과 차이 분석
package com.csdn.test;
public class Main {
public static void main(String[] args) {
System.out.println("(Integer)129 == (Integer)129");
System.out.println( (Integer)129 == (Integer)129);
System.out.println("(Integer)127 == (Integer)127");
System.out.println((Integer)127 == (Integer)127);
}
}
컴 파일 이 실 행 된 후 콘 솔 출력 결 과 는 다음 과 같 습 니 다.
(Integer)129 == (Integer)129
false
(Integer)127 == (Integer)127
true
평소 자바 기반 에 대한 관심 이 적 으 면 2, 3 년 경력 의 자바 프로그래머 도 왜 이런 차이 가 있 는 지 설명 할 방법 이 없 을 것 이다. 필자 도 인터넷 에서 자 료 를 찾 아 경 위 를 알 아 냈 다.이 문 제 를 이해 하려 면 먼저 자바 자동 포장, 분해 에 관 한 지식 을 익 혀 야 한다. 자바 의 자동 포장 / 분해 상 자 는 연산 작업 과 비교 작업 에서 발생 한다. 예 를 들 어:
Integer a = 10;
a = a + 10; //1. int 2. a+10 3. 20 Integer .
System.out.print(a > 10); //1. a int 2.
사용 = = 비교 할 때 상황 은 다음 과 같 습 니 다. 만약 = 양쪽 이 모두 포장 형식 이 라면 메모리 의 같은 대상 을 가리 키 는 지 비교 합 니 다.예 를 들 어 과 = = 양쪽 에 한 쪽 은 포장 유형 이 고 다른 한 쪽 은 기본 유형 이 며 포장 유형 을 기본 유형 으로 뜯 어 비교 합 니 다.예 를 들 면:
Integer a = new Integer(129);
Integer b = new Integer(129);
System.out.println(a == b); // , false
System.out.println(a == 129); // a , , true
문 제 는 표현 식 (Integer) 127 = = (Integer) 127 과 (Integer) 129 = = (Integer) 129 의 값 이 왜 다 를 까 하 는 것 이다.자바. lang. Integer 류 의 소스 코드 를 살 펴 보 자. 다음 과 같다.
/*
* Copyright (c) 1994, 2013, Oracle and/or its affiliates. All rights reserved.
* ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
package java.lang;
import java.lang.annotation.Native;
/**
* The {@code Integer} class wraps a value of the primitive type
* {@code int} in an object. An object of type {@code Integer}
* contains a single field whose type is {@code int}.
*
* In addition, this class provides several methods for converting
* an {@code int} to a {@code String} and a {@code String} to an
* {@code int}, as well as other constants and methods useful when
* dealing with an {@code int}.
*
*
Implementation note: The implementations of the "bit twiddling"
* methods (such as {@link #highestOneBit(int) highestOneBit} and
* {@link #numberOfTrailingZeros(int) numberOfTrailingZeros}) are
* based on material from Henry S. Warren, Jr.'s Hacker's
* Delight, (Addison Wesley, 2002).
*
* @author Lee Boynton
* @author Arthur van Hoff
* @author Josh Bloch
* @author Joseph D. Darcy
* @since JDK1.0
*/
public final class Integer extends Number implements Comparable<Integer> {
...
...
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 류 는 - 128 ~ 127 사이 의 대상 에 만 캐 시 를 했 습 니 다. (Integer) 127 = = (Integer) 127 양쪽 으로 상 자 를 포장 한 후 실제 메모리 에 있 는 같은 대상 을 가리 키 고 있 습 니 다. (Integer) 129 = = (Integer) 129. 상 자 를 인용 형식 으로 포장 한 후 캐 시 를 하지 않 고 메모리 에 있 는 다른 대상 을 가리 키 기 때문에 비교 결 과 는 false 입 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.