개인 학습 소감 노트 의 자바 중"="
예전 에 C 언어 를 배 웠 는데'='이 바로'='좌우 항목 의 수 치 를 비교 하 는 습관 이 저 를 자바 학습 에서 곤 혹 스 럽 게 했 습 니 다.자 료 를 찾 아 보 니'='은 등호 좌우 두 가지 수치 만 비교 하 는 것 이 아니 라 인용 대상 의 비교 일 수도 있다.대체 인용 대상 의 비 교 는 언제 가 수치 비교 일 까요?
요약:1:기본 데이터 형식(byte,short,int,long,float,double,char,boolean)은 모두 수치 비교 로 직접 정의 합 니 다.예 를 들 어 int i=2;byte j=2;double k=2.0;등등
2:클래스(Byte, Short, Integer, Long, Character, Boolean)이 실현 한 것 은 모두 인용 대상 비교 이다.예 를 들 어 Integer i=2;Byte j=2;Long k=2;등등
3:수치 비교 라면 그 수 치 를 직접 비교 하면 됩 니 다.클래스 가 실 현 된 인용 대상 이 라면 상수 탱크 를 고려 해 야 합 니 다.만약 에'=='좌우 두 가지 가 기본 데이터 유형 이 고 한 쪽 이 클래스 실현 방법 이 라면 수치 비교 로 보면 된다.
다음은 인용 대상 에 사 용 된 상수 탱크 에 대해 소감 을 말씀 드 리 겠 습 니 다.
깨 달 음 이 깊 은 예 는 다음 과 같다.
Integer i=127;Integer j=127;System.out.println(i==j);// true。
예시 2:
Integer i=128;Integer j=128;System.out.println(i==j);// false。
두 예제 가 수치 가 다른 것 을 제외 하고 다른 코드 는 모두 같 지만 결 과 는 다르다.분명 한 문 제 는 이 수치 에서 나 왔 다. 자 료 를 찾 아 보 니 두 개 모두 인용 대상 을 비교 한 것 으로 결과 가 다 르 고 주요 원인 은 하나의 수치 가 상수 탱크 의 범위 내 에 있 지 않 기 때문이다.
상수 지 나 도 요 며칠 동안 알 고 있었어. 상수 지 에 대해 깊 은 나 는 아직 잘 모 르 지만,지금 나 는 이 세 마디 를 기억 하고 있다. (1)자바 의 8 가지 기본 유형 에 대응 하 는 클래스(Byte, Short, Integer, Long, Character, Boolean, Float, Double), Float 와 Double 을 제외 하고, 다른 여섯 가 지 는 모두 상수 탱크 를 실현 했다. 그러나 이들 은-128 보다 크 고 127 보다 작 을 때 만 상수 탱크 를 사용한다.
(왜 수치 가 이 구간 이 냐 고 물 어보 시 면 요?Jdk 도움말 문서 에서 Public static Integer value Of(int i)에 대한 설명 은 다음 과 같 습 니 다.지정 한 int 값 을 표시 하 는 Integer 인 스 턴 스 를 되 돌려 줍 니 다.새로운 Integer 인 스 턴 스 가 필요 하지 않 으 면 구조 방법 이 아 닌 이 방법 을 우선 사용 해 야 합 니 다
Integer(int)
이 방법 은 캐 시 를 통 해 자주 요청 하 는 값 으로 공간 과 시간 성능 을 현저히 향상 시 킬 수 있 기 때 문 입 니 다.코드 는 다음 과 같 습 니 다:
public static Integer valueOf(int i)
{
final int offset = 128; // int
if (i >= -128 && i <= 127) // -128 127 ,
{
return IntegerCache.cache[i + offset];// i+offset, 0 ( )
}
return new Integer(i);
}
) (2)상수 탱크 의 같은 수치 에 대응 하 는 인용 대상 은 모두 같은 주소 이 고 수치 가 다른 것 은 분명 다른 주소 일 것 이다(즉,상수 탱크 에 같은 수치 에 다른 주소 가 나타 나 지 않 을 것 이다.상수 탱크 는 메모리 공간 과 시간 을 절약 하기 위 한 최적화 방법 이기 때문이다). (3)상기 6 가지 상수 탱크 가 실 현 된 유형 대상 을 만 들 때(new 가 나 온 것 이 아 닙 니 다)상수 탱크 에서 같은 수치 가 있 는 지,같은 수치 가 있 으 면 참조 하고 없 으 면 상수 탱크 에 만 들 고 추가 합 니 다.
위의 여섯 가지 가 상수 탱크 를 실현 한 클래스 입 니 다.이러한 클래스 는 new 를 통 해 실례 화 를 실현 할 수 있 습 니 다.그러나 new 를 통 해 실 현 된 실례 화 대상 의 데 이 터 는 상수 탱크 에 저장 되 지 않 고 더미 에 저장 되 며 모든 new 대상 은 하나의 공간 저장 데 이 터 를 다시 신청 합 니 다.예 는 다음 과 같다.
예시 3:
Integer i=new Integer(127);Integer j=new Integer(127);System.out.println(i==j);// false
예시 4:
Integer i=new Integer(128);Integer j=new Integer(128);System.out.println(i==j);// false
new 가 나 오 는 대상 마다 가리 키 는 주소 가 다 르 기 때문에 결 과 는 false 입 니 다.
위의 비교 에 대해 정리 한 예 를 들 었 는데 코드 는 다음 과 같다.
public class Test
{
public static void main(String[] args)
{
int int1=1;
int int2=1;
System.out.println("int1 int2 1 :"+(int1==int2));
int1=-129;
int2=-129;
System.out.println("int1 int2 -129 :"+(int1==int2));
int1=128;
int2=128;
System.out.println("int1 int2 128 :"+(int1==int2));
Integer integer1=1;
Integer integer2=1;
System.out.println("integer1 integer2 1 :"+(integer1==integer2));
integer1=-129;
integer2=-129;
System.out.println("integer1 integer2 -129 :"+(integer1==integer2));
integer1=128;
integer2=128;
System.out.println("integer1 integer2 128 :"+(integer1==integer2));
Integer newInteger9=new Integer(1);
Integer newInteger10=new Integer(1);
System.out.println("newInteger9 newInteger10 1 :"+(newInteger9==newInteger10));
Integer newInteger5=new Integer(-129);
Integer newInteger6=new Integer(-129);
System.out.println("newInteger5 newInteger6 -129 :"+(newInteger5==newInteger6));
Integer newInteger7=new Integer(128);
Integer newInteger8=new Integer(128);
System.out.println("newInteger7 newInteger8 128 :"+(newInteger7==newInteger8));
//
newInteger5=1;
newInteger6=1;
System.out.println("newInteger5 newInteger6 1 :"+(newInteger5==newInteger6));
// ,
newInteger5=128;
newInteger6=128;
System.out.println("newInteger5 newInteger6 128 :"+(newInteger5==newInteger6));
int1=1;//
integer1=1;//
newInteger5=1;// new
// int1 integer1 1,
System.out.println("int1 integer1 1 :"+(int1==integer1));
// int1 newInteger5 1,
System.out.println("int1 newInteger5 1 :"+(int1==newInteger5));
// integer1 newInteger5 1,
System.out.println("integer1 newInteger5 1 :"+(integer1==newInteger5));
}
}
실행 결 과 는:
int1 int2 1 :true
int1 int2 -129 :true
int1 int2 128 :true
integer1 integer2 1 :true
integer1 integer2 -129 :false
integer1 integer2 128 :false
newInteger9 newInteger10 1 :false
newInteger5 newInteger6 -129 :false
newInteger7 newInteger8 128 :false
newInteger5 newInteger6 1 :true
newInteger5 newInteger6 128 :false
int1 integer1 1 :true
int1 newInteger5 1 :true
integer1 newInteger5 1 :true
'=='의 비교 에 있어 좌우 항 은 String 유형의 비교 일 수도 있 습 니 다.인지 에 한계 가 있 기 때문에 이 해석 만 이해 할 수 있 습 니 다.통속 적 이 고 이해 하기 쉽 습 니 다.주소:http://developer.51cto.com/art/201106/266454.htm
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.