Java 중 (Integer) 127 = = (Integer) 127 과 (Integer) 129 = = (Integer) 129 표현 식 결과 차이 분석

7842 단어 Java
자바 기반 이 좋다 고 생각 했 는데 (Integer) 129 = = = (Integer) 129 표현 식 을 처음 봤 을 때 결과 가 true 인지 false 인지 바로 반영 되 지 않 았 습 니 다. 아래 의 간단 한 자바 프로그램 을 살 펴 보 세 요.
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 입 니 다.

좋은 웹페이지 즐겨찾기