java - 자바에서 정수 비교

기사 출처 java

결과에 대한 설명이없는 Java 책에서 다음 코드를 얻었습니다. 나는 그것을 실행하고 아래에 인라인으로 표시된 결과를 얻었지만 결과를 이해하는 데 도움이 필요합니다.

1. Integer i = -10;
2. Integer j = -10;
3. System.out.print(i==j);  //  ==> true
4. System.out.print(i.equals(j));   //  ==> true
5. Integer n = 128;
6. Integer m = 128;
7. System.out.print(n==m);  //  ==> false
8. System.out.print(n.equals(m));   //  ==> true


내 질문은 다음과 같습니다.


3 번 줄이 사실로 확인되는 이유는 무엇입니까? 두 개의 개별 개체가 아닙니까?
3 번 행이 사실이라면 7 번 행이 사실이 아닌 이유는 무엇입니까?


사전에 감사드립니다.
Integer는 객체이고 int는 "스칼라"입니다. Integer i = 270;와 같은 이름은 Integer i = Integer.valueOf(270);가됩니다. 따라서 두 개의 Integer 개체를 만들면 서로 구별됩니다 (==에서 설명).

그러나 valueOf의 JDK는 -128에서 127까지의 작은 값으로 Integer 객체의 생성을 캐시하고 사용 가능한 경우 이전 버전을 재사용합니다. 따라서 두 개의 명백하게 구별되는 작은 Integers 인스턴스는 개별적으로 인스턴스화 된 것처럼 보이지만 실제로는 동일 할 수 있습니다.

int 값으로 동일한 작업을 시도하면 == 비교는 항상 참이되고 equals() 호출은 컴파일 오류를 생성합니다 (int는 객체가 아니기 때문).

이 질문에 대해 Stack Overflow에서 비슷한 토론을 찾았습니다: https://stackoverflow.com/questions/13672686/

관련 기사
java - RandomAccess 인터페이스, 왜 메소드가 없습니까?
enums - Java API에서 열거 형 사용
java - charAt ()은 문자열을 반환하지 않습니까?
java - ArrayIndexOutOfBoundsException 데이터 액세스 시도
java - Java의 내부 클래스에서 변수에 액세스
java - 날짜 시간 형식 Java로 시간 추가
java - Java 인터페이스에 대한 Java 특성 파일 바인딩
java - "리소스로 시도"에 문제가 있음
java - 배포 (게시) 후 Weblogic 오류 : 오류 503-- 서비스를 사용할 수 없음
java - Java의 arraylist에 대용량 파일을로드하는 가장 좋은 방법