Integer 와 Integer 비교 및 Integer 와 Int 의 비교 분석

14003 단어 Java
프로젝트 를 하 는 과정 에서 수치 유형의 비교 에 있어 실수 하기 쉽다 는 것 을 발견 했다.특히 Integer 와 Integer 의 비교,Integer 와 int 의 비교.비록 이것들 은 모두 기초 문법 이지 만 조금 만 주의 하지 않 으 면 실 수 를 하기 쉽 고 실제 개발 과정 에서 이런 실수 가 발생 하면 작은 실수 로 천 리 를 잃 기 쉽다.여기 서 이 기초 지식 들 을 총 결 해 보 자.
자바 는 모든 것 이 대상 이 라 고 선언 하지만 원본 데이터 형식 은 예외 입 니 다.int 는 성형 숫자 로 자바 의 9 개의 원시 데이터 형식(Primitive Types)(boolean,byte,short,char,int,float,double,long,void)중 하나 입 니 다.Integer 는 int 에 대응 하 는 포장 류 로 int 형식의 필드 에 데 이 터 를 저장 하고 기본 적 인 조작 을 제공 합 니 다.예 를 들 어 수학 연산,int 와 문자열 간 전환 등 입 니 다.자바 5 에 서 는 자동 포장 과 자동 분해 기능(boxing/unboxing)을 도입 하 였 으 며,자바 는 문맥 에 따라 자동 으로 전환 하여 관련 프로 그래 밍 을 크게 간소화 하 였 다.javac 는 자동 으로 상 자 를 Integer.valueOf()로 변환 하고,상 자 를 Integer.intValue()로 대체 합 니 다.
자동 포장 은 사실상 문법 사탕 이 라 고 할 수 있다.문법 사탕 이란 무엇 입 니까?자바 플랫폼 이 우 리 를 위해 자동 으로 전환 을 하여 서로 다른 쓰기 가 실 행 될 때 등가 가 되도록 보장 하 는 것 으로 간단하게 이해 할 수 있 습 니 다.그들 은 ,즉 생산 된 바이트 코드 가 일치 합 니 다.(이 문장 은 극 객 시간 칼럼 에서 발췌 한 것 이다)
원본 데이터 형식의 변 수 는 병렬 관련 수단 을 사용 해 야 스 레 드 안전 을 확보 할 수 있 습 니 다.스 레 드 안전 계산 이 필요 하 다 면 AtomicInteger,AtomicLong 과 같은 스 레 드 안전 류 를 사용 하 는 것 을 고려 하 는 것 을 권장 합 니 다. java 。자바 의 범 형 은 어느 정도 가짜 범 형 이 라 고 할 수 있 기 때문에 자바 컴 파일 기 는 자동 으로 유형 을 대응 하 는 특정 유형 으로 변환 합 니 다.이 는 범 형 을 사용 하기 로 결 정 했 으 며,해당 유형 이 Object 로 바 뀔 수 있 도록 해 야 한다.
잔말 말고 데모 로 오 세 요.효과 가 더 직접적 이에 요.
public class Test {

	public static void main(String[] args) {
		
		Integer a1 = 6;
		Integer a2 = 6;
		int a11 = 6;
		
		System.out.println(a1 == a2); //true
		System.out.println(a1 == a11); //true
		
		System.out.println("----------------");
		
		Integer a3 = 128;
		Integer a4 = 128;
		int a33 = 128;
		
		System.out.println(a3 == a4); //false
		//Integer      int,   true
		System.out.println(a3 == a33); //true
		System.out.println(a3.equals(a4)); //true
		
		System.out.println("----------------");
		
		Integer a5 = new Integer(6);
		Integer a6 = new Integer(6);
		
		System.out.println(a5 == a6); //false
		System.out.println(a5.equals(a6)); //true

	}

명확 한 것 은 포장 형(Integer)과 기본 형(int)이 자동 으로 상 자 를 뜯 는 다 는 점 이다(jdk 1.5 이상).
이곳 에서 많은 사람들 이 비교적 현혹 되 기 쉬 운 것 은 다음 과 같은 상황 이다.
		Integer a1 = 6;
		Integer a2 = 6;
		System.out.println(a1 == a2); //true
		
		Integer a3 = 128;
		Integer a4 = 128;
		System.out.println(a3 == a4); //false

jdk 소스 코드 를 연구 한 적 이 있다 면 Integer a3=128;자바 컴 파일 시 Integer a3=Integer.valueOf(128)로 번 역 됩 니 다.밸 류 오 브()의 소스 코드 를 다시 한 번 살 펴 보면 더욱 뚜렷 해진 다.
public static Integer valueOf(int i) {
    assert IntegerCache.high >= 127;
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}

상기 소스 코드 에서 발견 할 수 있 습 니 다. ,Integer a1=6 시 에 6 을 캐 시 하고 다음 에 Integer a2=6 을 씁 니 다.캐 시 에서 직접 가 져 오고 new 대상 을 사용 하지 않 기 때문에 a1 과 a2 를 비교 할 때 true 입 니 다.그러나 a3 와 a4 는 범 위 를 초과 하여 new 의 대상 이 될 것 이다. -128 127 , 이때 a3 과 a4 는 값 은 같 지만 주 소 는 다 르 기 때문에 비교 하면 false 이다.
위의 분석 을 통 해 알 수 있 듯 이:
  • 두 개 모두 new 에서 나 온 Integer 가 아니 고 수 치 는-128~127 사이 에 있 습 니 다.==으로 비교 할 때 기본 값 이 같 을 때 true 이 고 그렇지 않 으 면 false 입 니 다.
  • 둘 다 new 에서 나 온 Integer 로 false
  • 입 니 다.
  • int 와 Integer 를 비교 하면 수치 가 같 고==으로 비교 할 때 true 입 니 다.(Integer 는 자동 으로 상 자 를 뜯 어서 int 로 비교 하기 때 문 입 니 다.
  • == , JVM , equals 대상 이 동일 한 지 판단 한다.
    Integer var = ?==의 할당 값 은 기 존 대상 을 재 활용 하기 때문에 이 구간 내의 Integer 사용==판단 을 통 해 통과 할 수 있 으 나 구간 이외 의 모든 데 이 터 는 에서 새로 생 겨 통과 하지 않 습 니 다.
    따라서==로 수 치 를 비교 하면 작은 테스트 데이터 에서 통 과 될 수 있 고 생산 환경 에 이 르 러 서 야 문제 가 생 길 수 있다.
    내용 을 절약 하기 위해 다음 포장 대상 과 의 두 가지 인 스 턴 스 를 기본 값 과 동시에=로 판단 하면 true 입 니 다.
     Boolean  
     Byte  
     Character, \u0000 - \u007f(7f     127)  
     Integer, -128 — 127  
    

    다른 포장 형의 캐 시 상황 도 볼 수 있 습 니 다.
    Boolean:(    )
    Byte:(    )
    
    Character(    '\u0000' '\u007F')
    Short(-128127  )
    Long(-128127  )
    
    Float(    )
    Doulbe(    )
    

    두 Integer 대상 의 값(모두 new 대상)을 비교 하려 면 을 통 해 전환 한 후에 비교 할 수 있 습 니 다.다음 과 같 습 니 다.
    		Integer a3 = 128;
    		Integer a4 = 128;
    		System.out.println(a3.intValue() == a4.intValue());
    
    .intValue()로 비교 할 수도 있 습 니 다.다음 과 같 습 니 다.
    		Integer a3 = 128;
    		Integer a4 = 128;
    		System.out.println(a3.equals(a4)); //true
    

    좋은 웹페이지 즐겨찾기