자료구조

+) JAVA 문자열 비교하기 ==, equals()

나는나는용 2023. 2. 21. 00:09
728x90

String 변수 생성의 두가지 방법

  1. 리터럴
  2. new연산자 이용

1. 리터럴 방식

리터럴 방식으로 선언된 문자열들은 string constant pool이라는 영역에 존재하게 된다.

과정
String 내부의 intern() 메서드 호출.
intern() 메서드는 주어진 문자열이 string constant pool에 존재하는지 검색.

  • 있다면: 주어진 문자열의 주소값을 반환.
  • 없다면: string constant pool에 주어진 문자열을 새로 저장하고, 그 주소값을 반환.

2. new 연산자 이용

new연산자를 이용하여 생성된 문자열들은 Heap 영역에 존재하게 된다.
같은 값을 저장한다고 하더라도 다른 주소에 저장됨.

3. 위 두 방식의 차이

==연산자: 비교하고자 하는 두 대상의 주소값을 비교.
equals(): 비교하고자 하는 두 대상의 값 자체를 비교.

package compareStr;

public class doubleEqual {

    public static void main(String[] args) {

        String str1 = "apple";        //리터럴 방식 -> a라는 공간에 저장되었다고 가정.
        String str2 = new String("apple");    //값은 같지만 new로 생성->b라는 공간에 저장되었다고 가정.

        if(str1 == str2) {
            System.out.println("두 값이 같다.");
        }else {
            System.out.println("두 값이 다르다.");    //a공간의 apple과 b공간의 apple (다름)
        }


        String str3="apple";        //리터럴 방식 -> 이미 존재하는 값임 -> a(주소값)반환

        if(str1 == str3) {
            System.out.println("두 값이 같다.");    //같은 a공간의 apple
        }else {
            System.out.println("두 값이 다르다.");
        }

        //값이 같은지만을 알아보자
        if(str1.equals(str2)) {
            System.out.println("두 값이 같다.");    //a에 있던, b에 있던 일단 둘 다 apple임.
        }else {
            System.out.println("두 값이 다르다.");
        }
        if(str2.equals(str3)) {
            System.out.println("두 값이 같다.");    //a에 있던, b에 있던 일단 둘 다 apple임.
        }else {
            System.out.println("두 값이 다르다.");
        }
    }

}

실행결과

728x90