Integer 와 Integer 비교 및 Integer 와 Int 의 비교 분석
14003 단어 Java
자바 는 모든 것 이 대상 이 라 고 선언 하지만 원본 데이터 형식 은 예외 입 니 다.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 이다.위의 분석 을 통 해 알 수 있 듯 이:
== , JVM
。 , equals
대상 이 동일 한 지 판단 한다.Integer var = ?
==
의 할당 값 은 기 존 대상 을 재 활용 하기 때문에 이 구간 내의 Integer 사용==판단 을 통 해 통과 할 수 있 으 나 구간 이외 의 모든 데 이 터 는
에서 새로 생 겨 통과 하지 않 습 니 다.따라서==로 수 치 를 비교 하면 작은 테스트 데이터 에서 통 과 될 수 있 고 생산 환경 에 이 르 러 서 야 문제 가 생 길 수 있다.
내용 을 절약 하기 위해 다음 포장 대상 과 의 두 가지 인 스 턴 스 를 기본 값 과 동시에=로 판단 하면 true 입 니 다.
Boolean
Byte
Character, \u0000 - \u007f(7f 127)
Integer, -128 — 127
다른 포장 형의 캐 시 상황 도 볼 수 있 습 니 다.
Boolean:( )
Byte:( )
Character( '\u0000' '\u007F')
Short(-128 — 127 )
Long(-128 — 127 )
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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.