인 스 턴 스 를 통 해 자바 Integer 류 와 int 의 차 이 를 알 수 있 습 니 다.

코드 인 스 턴 스 는 다음 과 같 습 니 다.

public static void main(String[] args) {
  Integer i = 10;
  Integer j = 10;
  System.out.println(i == j);
   
  Integer a = 128;
  Integer b = 128;
  System.out.println(a == b);
   
  int k = 10;
  System.out.println(k == i);
  int kk = 128;
  System.out.println(kk == a);
   
  Integer m = new Integer(10);
  Integer n = new Integer(10);
  System.out.println(m == n);
}
우 리 는 역 컴 파일 도구 Jad 를 사용 하여 다음 과 같은 코드 를 얻 었 습 니 다.

public static void main(String args[])
{
  Integer i = Integer.valueOf(10);
  Integer j = Integer.valueOf(10);
  System.out.println(i == j);
  Integer a = Integer.valueOf(128);
  Integer b = Integer.valueOf(128);
  System.out.println(a == b);
  int k = 10;
  System.out.println(k == i.intValue());
  int kk = 128;
  System.out.println(kk == a.intValue());
  Integer m = new Integer(10);
  Integer n = new Integer(10);
  System.out.println(m == n);
}
인쇄 결과:
  
우선 Integer i=10 을 직접 설명 하면 자동 으로 포장 이 Integer i=Integer.valueOf(10)로 변 합 니 다.Integer i 는 자동 으로 상 자 를 i.intValue()로 뜯 습 니 다.
① 첫 번 째 인쇄 결 과 는 true
i==j 에 대해 우 리 는 이것 이 두 개의 Integer 류 라 는 것 을 알 고 있 습 니 다.그들 은 equals 를 사용 해 야 합 니 다.여 기 는==주소 로 비교 하면 결 과 는 false 일 것 입 니 다.그러나 실제 결 과 는 true 입 니 다.이것 은 왜 입 니까?
우 리 는 Integer 류 의 value Of()방법 으로 들 어 갑 니 다.
  
원본 코드 를 분석 하면 i>=-128 및 i<=127 에 있 을 때 첫 번 째 성명 은 i 의 값 을 캐 시 에 넣 고 두 번 째 는 Ingeter 대상 을 다시 만 드 는 것 이 아니 라 캐 시 에 있 는 데 이 터 를 직접 가 져 옵 니 다.그러면 첫 번 째 인쇄 결 과 는 i=10 이 캐 시 표시 범위 내 에 있 기 때문에 true 입 니 다.
②、두 번 째 인쇄 결 과 는 false
위의 분석 을 통 해 알 수 있 듯 이 128 은-128 에서 127 사이 에 있 지 않 기 때문에 첫 번 째 대상 을 만 들 때 캐 시 가 없 었 고 두 번 째 로 새로운 Integer 대상 을 만 들 었 습 니 다.그러므로 인쇄 결 과 는 false 입 니 다.
③ 세 번 째 인쇄 결 과 는 true
Integer 의 자동 분해 기능,즉 두 가지 기본 데이터 형식 을 비교 한 결과 당연히 true 입 니 다.
④、네 번 째 인쇄 결 과 는 true
해석 은 세 번 째 와 같다.int 와 integer(new 든 아니 든)비 교 는 모두 true 입 니 다.Integer 를 자동 으로 int 로 뜯 어서 비교 하기 때 문 입 니 다.
⑤、다섯 번 째 인쇄 결 과 는 false
이 값 은 10 이지 만 뉴 키 워드 를 통 해 만 든 두 대상 이기 때문에 캐 시 개념 이 존재 하지 않 습 니 다.new 키워드 로 만 든 두 대상 을==로 비교 하면 결 과 는 당연히 false 입 니 다.
5.테스트
Integer a = 1;
Integer b = 2;
Integer c = 3;
Integer d = 3;
Integer e = 321;
Integer f = 321;
Long g = 3L;
Long h = 2L;
System.out.println(c == d);
System.out.println(e == f);
System.out.println(c == (a + b));
System.out.println(c.equals((a+b)));
System.out.println(g == (a+b));
System.out.println(g.equals(a+b));
System.out.println(g.equals(a+h));
역 컴 파일 결과:
  
분석:첫 번 째 와 두 번 째 결 과 는 의문 이 없습니다.Integer 류 는-128 에서 127 의 캐 시 문제 입 니 다.
세 번 째 는 a+b 에 산술 연산 이 포함 되 어 있 기 때문에 자동 으로 상 자 를 뜯 는 과정(intValue 방법 을 호출 합 니 다)을 촉발 합 니 다.
네 번 째 는 c.equals(a+b)에 대해 자동 분해 과정 을 먼저 촉발 한 다음 에 자동 포장 과정 을 촉발 합 니 다.즉,a+b 는 각각 intValue 방법 을 호출 하여 덧셈 연산 후의 수 치 를 얻 은 후에 Integer.valueOf 방법 을 호출 한 다음 에 equals 비 교 를 합 니 다.
다섯 번 째 는 g==(a+b)에 대해 a+b 를 먼저 계산 하 는 것 도 각자 의 intValue 방법 을 먼저 호출 하여 수 치 를 얻 은 후에 앞의 g 가 Long 형식 이기 때문에 자동 으로 상 자 를 long 으로 뜯 을 수 있 습 니 다.=연산 자 는 작은 범위 의 데이터 형식 을 큰 범위 의 수치 유형 으로 바 꿀 수 있 습 니 다.즉,int 는 log 유형 으로 바 뀌 고 두 log 유형의 수 치 를 비교 할 수 있 습 니 다.
여섯 번 째 는 g.equals(a+b)에 대해 같은 이치 로 a+b 는 먼저 자동 으로 상 자 를 뜯 은 다음 에 결 과 를 자동 으로 포장 합 니 다.설명 해 야 할 것 은 equals 연산 자 는 유형 전환 을 하지 않 습 니 다.그래서 Long.equals(Integer)였 고 결 과 는 당연히 false 였 습 니 다.
일곱 번 째 는 g.equals(a+h)에 대해 연산 자+유형 전환 을 진행 합 니 다.a+h 는 각각 상 자 를 뜯 은 다음 에 int+long 이 고 결 과 는 long 입 니 다.그 다음 에 long 은 자동 으로 상 자 를 Long 으로 포장 하고 두 Long 은 equals 판단 을 합 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기