[Java] String형의 정확한 비교

8104 단어 equalsstringJava

String형 비교 깊이 파고들기


구성된 문자열 값 비교.

등 비교 방법


1. ==


·기본형에서 값을 비교한다.
· 객체 유형에서 객체의 참조 값을 비교하여 객체가 동일한지 여부를 판단합니다.

2. equals()


객체 유형에서만 사용할 수 있으며 객체의 컨텐트를 비교하여 객체가 동일한지 여부를 판단합니다.
※ 오브젝트 클래스에 equals가 정의되어 있습니다.
String 클래스에서 override.
즉, String형은 참조형의 객체이므로 equals를 사용하면 됩니다.

검증(==이면 정말 비교가 안 되나요)


StringSample.java
    String str1 = "A";
    String str2 = "A";
    String str3 = new String("A");
    System.out.println(str1.hashCode());
    System.out.println(str2.hashCode());
    if(str1 == str2) {
        System.out.println("TRUE");
    }else {
        System.out.println("FALSE");
    }
    if(str1 == str3) {
        System.out.println("TRUE");
    }else {
        System.out.println("FALSE");
    }

결과

100
100
TRUE
TRUE가 되었습니다.String 타입은 ==로도 비교할 수 있습니까?

조사


String형은 초기화할 때 더미 영역에서 값을 생성하지만 같은 값을 사용할 때 반복적으로 사용할 수 있을 것 같습니다.
※ new 시 새 영역이 생성됩니다.

도해를 해봤어요.



메모리를 절약하기 위해 new를 사용하지 않고 "A"값이 일치하는 구역(주소=100)을 반복합니다.
※ 참조 값: 대상 스토리지 주소 참조

문자열 값을 변경할 때의 동작


String比較2.png
변수의 값을 바꾸지 않으면 참조 원본의 값(주소=100)이 변경되고, new'B'의 새로운 구역이 참조 목적지를 변경합니다.(참조 주소를 100 → 200으로 변경)
※ String은 모방이므로 참조 객체의 값을 변경할 수 없습니다.

String 객체의 equals는 무엇을 합니까?


String.class
    private final char value[];

    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;                //自オブジェクトのvalue
                char v2[] = anotherString.value;  //比較先オブジェクトのvalue
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])           //Stirngをcharに分解して値比較
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }
String 객체를 char[]로 분해하여 값을 하나씩 비교합니다.

결론


String 대상은 메모리를 절약하기 위해 같은 값의 경우 서로 다른 부분 변수라도 참조 값(주소 참조)이 같을 수 있지만 보장할 수 없기 때문에 equals에서 비교해야 한다.

좋은 웹페이지 즐겨찾기