개인 학습 소감 노트 의 자바 중"="

처음으로 블 로그 에 학습 소감 노트 를 쓰 는데 틀린 부분 이 있 으 면 지적 해 주세요.
    예전 에 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

좋은 웹페이지 즐겨찾기