위 기사에서 언급했듯이 Java 제네릭이 기본 유형 대신 객체를 사용하는 이유는 무엇입니까? 그런데 저는 아직도 Integer와 int의 차이를 잘 이해하지 못해서 바이두에 가보니 어떤 훌륭한 분이 쓴 글이 꽤 좋은 것 같아서 다시 올려서 공유하게 되었습니다.
Integer와 int의 차이점
Integer는 int가 제공하는 캡슐화 클래스이며 int는 Java의 기본 데이터 유형입니다. Integer의 기본값은 null이고 int의 기본값은 0입니다. Integer로 선언된 변수는 인스턴스화할 필요가 없으며 int로 선언된 변수는 인스턴스화할 필요가 없습니다. Integer는 객체이고 참조는 이 객체를 가리키는 반면 int는 기본 유형이며 값을 직접 저장합니다.
Integer와 int의 가장 기본적인 차이점을 아는 것 외에도 Integer와 int를 실제로 사용할 때 직면하는 몇 가지 다른 문제도 알아야 합니다.
그렇지 않으면 면접관이 다시 Integer i = 1; int ii = 1; i==ii인지 묻는다면? 다른 질문을 하시면 답변을 못하시는 분들도 계실 것으로 추정됩니다. 그래서 요약해 보았는데, 모두에게 도움이 되었으면 좋겠습니다.
코드는 다음과 같습니다.
public class Main { public static void main(String[] args) { int a = 128; Integer b = 127; Integer c = 127; Integer d = 128; Integer e = 128; Integer f = new Integer("128"); Integer g = new Integer("127"); Integer h = new Integer("127"); //方案一() System.out.println("方案一:Integer与new Integer不同初始化方法的值的比较,Integer与new Integer不会相等"); //Integer e = 128; //Integer f = new Integer("128"); if (e == f){ System.out.println("true"); }else{ System.out.println("false"); } System.out.println("---------------------"); //方案二 System.out.println("方案二:创建两个都是直接赋值的Integer"); //Integer b = 127; //Integer c = 127; if (b == c){ System.out.println("true"); }else{ System.out.println("false"); } //Integer d = 128; //Integer e = 128; if (d == e){ System.out.println("true"); }else{ System.out.println("false"); } System.out.println("---------------------"); //方案三 System.out.println("方案三:两个都是new出来的Integer"); //Integer g = new Integer("127"); //Integer h = new Integer("127"); if (g == h){ System.out.println("true"); }else{ System.out.println("false"); } System.out.println("---------------------"); //方案四 System.out.println("方案四:int与Integer比较"); //int a = 128; //Integer f = new Integer("128"); if (a == f){ System.out.println("true"); }else{ System.out.println("false"); } } }
실행 결과는 다음과 같습니다.
方案一:Integer与new Integer不同初始化方法的值的比较,Integer与new Integer不会相等 false --------------------- 方案二:创建两个都是直接赋值的Integer true false --------------------- 方案三:两个都是new出来的Integer false --------------------- 方案四:int与Integer比较 true
옵션 1:
먼저 두 개체 e에 대해 Integer와 new Integer라는 두 가지 초기화 방법을 사용합니다. f. 두 개체를 비교합니다.
Integer e = 128; Integer f = new Integer("128"); if (e == f){ System.out.println("true"); }else{ System.out.println("false"); }
반환 결과: false
결론: Integer와 new Integer는 동일하지 않습니다. e의 참조는 힙을 가리키고 f는 이를 저장하는 데 사용되는 메모리(상수 풀)를 가리킵니다. 메모리 주소가 다르기 때문에 false입니다.
옵션 2:
직접 할당된 두 개의 정수를 만듭니다.
//Integer b = 127; //Integer c = 127; if (b == c){ System.out.println("true"); }else{ System.out.println("false"); } //Integer d = 128; //Integer e = 128; if (d == e){ System.out.println("true"); }else{ System.out.println("false"); }
반환 결과:
true
false
결론: 둘 다 정수로 직접 할당됩니다. 숫자가 -128에서 127 사이이면 true이고, 그렇지 않으면 false입니다.
이유: Java가 Integer i2를 컴파일할 때 = 128, 이는 -> Integer i2 = Integer.valueOf(128);로 변환되며 valueOf() 함수는 -128에서 127 사이의 숫자를 캐시합니다.
소스 코드를 보면 모두가 -128 사이의 숫자를 이해할 것입니다. Integer b = 127이면 127이 캐시됩니다. 다음에 Integer c = 127이 기록되면 캐시에서 직접 가져오며 새 항목은 아닙니다.
/** * 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() {} }
옵션 3:
먼저 두 개체 g와 h에 대해 새로운 Integer 초기화 방법을 사용한 다음 두 개체를 비교합니다.
Integer g = new Integer("127"); Integer h = new Integer("127"); if (g == h){ System.out.println("true"); }else{ System.out.println("false"); }
반환 결과: false
결론: 둘 다 새로운 지점의 Integer 개체입니다. 두 개의 다른 Integer 객체, 둘 다 false
옵션 4:
먼저 두 객체 a와 f에 대해 int와 new Integer의 두 가지 다른 초기화 방법을 사용한 다음 이 두 객체를 비교합니다.
int a = 128; Integer f = new Integer("128"); if (a == f){ System.out.println("true"); }else{ System.out.println("false"); }
결과를 반환합니다. : true
결론: Integer가 자동으로 int로 언박싱된 다음 비교되기 때문에 int와 정수(새 항목인지 여부에 관계없이)의 비교는 사실입니다.
관련 기사:
Java 튜토리얼 - 차이점 int와 Integer 사이
Java에서 int와 Integer의 차이점에 대한 자세한 설명
위 내용은 Java에서 Integer와 int의 차이점에 대한 자세한 분석 요약의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!