본문 바로가기

Java/Java

(JAVA) String.equals() 내부 뜯어보기

우리가 자주 쓰는 equals 내부를 들어가 보자

 

그냥 아래 단순 두 줄을 알아볼 것이다.

public class App 
{
    public static void main( String[] args )
    {
        String str = new String("test");
        
        boolean result = str.equals("test");
    }
}

 

초기화 과정

 

String 인스턴스 생성 후 파라미터에 해당하는 value, coder, hash 값 초기화

    private final byte[] value;
    private final byte coder;
    private int hash;
    
	@HotSpotIntrinsicCandidate
    public String(String original) {
        this.value = original.value;
        this.coder = original.coder;
        this.hash = original.hash;
    }

 

 

 

value : 각각의 단어에 해당하는 byte 값

coder : type이 byte인데 잘 모르겠다

hash : 해쉬값 같은데 잘 모르겠다

 

아는 게 없다 아직

 

아.. hash는 hashcode이다.

String str = "test";
System.out.println(str.hashCode());

.실행결과


본격적인 eqluals 내부

 

 

equals의 코드는 이렇다

이전에 인스턴스 생성 시 초기화해두었던 값과 파라미터의 값이 같은지 비교

해당 파라미터 값이 String 인스턴스 타입인지 확인

 

static final boolean COMPACT_STRINGS = true;

byte coder() {
    return COMPACT_STRINGS ? this.coder : 1;
}

COMPACT_STRINGS는 true이고 coder는 이전에 저장해두었던 0 이기에 왼쪽에 있는 coder 값 0을 반환

이것 또한 이전에 인스턴스 생성 시 저장해 두었던 값과 같은지를 비교하는 것이다.

 

this.isLatin() 은 위와 동일하고

 

StringLatin1 클래스의 equals를 호출한다. - (인스턴스 생성 시 저장해두었던 값, 파라미터의 값)

    public static boolean equals(byte[] value, byte[] other) {
        if (value.length == other.length) {
            for(int i = 0; i < value.length; ++i) {
                if (value[i] != other[i]) {
                    return false;
                }
            }

            return true;
        } else {
            return false;
        }
    }
  • 길이 비교
  • 해당 byte 배열의 index의 값이 같은지 비교

 

결과

해당 값은 true를 리턴하면 종료된다.

 

'Java > Java' 카테고리의 다른 글

(JAVA) 데몬쓰레드  (0) 2020.01.23
(JAVA) Integer.parseInt 내부 뜯어보기  (0) 2020.01.22
(JAVA) 쓰레드 우선순위  (0) 2020.01.21
(JAVA) 싱글쓰레드와 멀티쓰레드  (0) 2020.01.20
(JAVA) 쓰레드의 개요(2)  (0) 2020.01.19