자바 의 구덩이 들 (1)

8369 단어 자바
1. = = equals 기본 데이터 형식 과 스 택 에 저장 하고 = = 로 수치 판단 을 합 니 다.한편, 인용 데이터 형식, 예 를 들 어 Object, 대상 실 체 는 더미 에 저장 되 고 대상 인용 주 소 는 스 택 에 저장 되 며 = = 주소 가 같 는 지 비교 하 는 데 사용 되 며 equals 는 바 텀 소스 코드 를 통 해 발견 된다.
    /**
     * Compares this string to the specified object.  The result is {@code
     * true} if and only if the argument is not {@code null} and is a {@code
     * String} object that represents the same sequence of characters as this
     * object.
     *
     * @param  anObject
     *         The object to compare this {@code String} against
     *
     * @return  {@code true} if the given object represents a {@code String}
     *          equivalent to this string, {@code false} otherwise
     *
     * @see  #compareTo(String)
     * @see  #equalsIgnoreCase(String)
     */
    public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

기본 값 은 대상 의 주소 가 같은 지 비교 하 는 것 입 니 다. String 유형 은 대상 의 내용 이 같은 지 비교 할 수 있 습 니 다. equals 와 hashcode 는 하위 클래스 가 다시 쓸 수 있 는 방법 입 니 다. 하위 클래스 는 자신의 구체 적 인 업무 에 따라 업무 의 수 요 를 재 작성 할 수 있 습 니 다.String 형식의 데 이 터 는 jvm 컴 파일 시 최적화 문제 와 관련 됩 니 다. 예 를 들 어 다음 과 같 습 니 다.
package com.sparkhuu.base;


public class StringTest {
    public static void main(String[] args) {
        String s1 = "a" + "b" + 1; //         :"ab1"
        String s2 = "ab1";
        // ==           ,    ,          ,      
        System.out.println(s1 == s2);
        // equals          ,     ,String     equals  
        System.out.println(s1.equals(s2));
        String a = "1";
        final String testA = "1";
        String b = a + "2" + 3; //         b,c       , b,c    String   equals  
        String c = "123";
        String testB = testA + "2" + 3;
        System.out.println(testB == c);
        System.out.println(testB.equals(c));
        System.out.println(b == c); 
        System.out.println(b.equals(c));
        String eString = "a";
        String fString = eString + "b";
        String gString = "ab";
        String hString = new String(gString);//   new            
        System.out.println(fString == gString);
        System.out.println(hString == gString);
        System.out.println(hString.intern() == gString.intern());

    }   
}

결과
true
true
true
true
false
true
false
false
true

2, 기본 데이터 형식의 패 키 징 클래스 int – > Integer char – > Character double – > Double 등 은 패 키 징 과 패 키 지 를 뜯 는 테스트 와 관련 됩 니 다.
package com.sparkhuu.base;

public class BaseNumberTest {
    public static void main(String[] args) {
        Integer a = 1;
        Integer b = 1;
        Integer e = -127;
        Integer f = -127;
        // Integer.valueOf(); [-128 127]    cache                 new Integer()          
        Integer c = 200;
        Integer d = 200;
        System.out.println(a == b);
        System.out.println(e == f);
        System.out.println(c == d);

        char x = ' ';
        char x1 = 'a';
        byte y = 'a';

        Boolean tr = true;
        Boolean shBoolean = true;
        System.out.println(tr == shBoolean);

    }
}

결과
true
true
false
true

주요 원인 은 기본 데이터 형식 이 패 키 징 류 로 바 뀔 때 패 키 징 류 의 init 를 호출 하고 패 키 징 류 의 일부 코드 는 cache, Integer, Short, Long 의 cache 범 위 는 - 128 에서 127 이 며 그 중에서 Integer 는 설정 을 통 해 범 위 를 수정 할 수 있 으 며 Short 와 Long 은 안 되 기 때문이다.Boolean 의 cache 범 위 는 true, false, Characher 모든 캐 시 Double 이 고 Float 에는 캐 시 가 없습니다.

좋은 웹페이지 즐겨찾기