Java의 string.equals() 대 == 비교

Rashmi Patidar 2024년2월15일
Java의 string.equals() 대 == 비교

Java에는 두 가지 유형의 객체 비교가 있습니다. 첫 번째는 == 연산자가 주소 작업에서 작동합니다. 내부적으로 개체의 참조를 비교합니다. 반면 equals 방법은 인스턴스의 실제 내용을 비교합니다.

다음은 연산자와 그 동작을 보여주는 코드 블록입니다.

public class Main {
  public static void main(String[] args) {
    String str1 = "name";
    String str2 = "name";
    String str3 = new String("name");
    System.out.println(str1.equals(str2));
    System.out.println(str1 == str2);
    System.out.println(str1.equals(str3));
    System.out.println(str3 == str1);
  }
}

위의 코드 블록에서 string의 세 가지 인스턴스가 정의됩니다. 문자열 클래스는 본질적으로 변경할 수 없습니다. 불변성은 생성된 인스턴스가 재정의될 수 없음을 의미합니다.

또한 변수는 힙 위치에 메모리를 보유합니다. 따라서 name 문자열을 만드는 동안 힙 메모리에 저장됩니다. 동일한 name 값을 가진 str2라는 다른 새 인스턴스가 초기화될 때 JVM은 이에 대한 다른 새 주소를 생성하지 않습니다. 대신 str1 인스턴스의 참조를 str2 변수에 할당합니다.

사실은 str1==str2를 두 문자열 인스턴스와 비교하려고 할 때 증명을 유지합니다. 두 참조가 메모리의 동일한 이름 주소를 가리키므로 명령문 결과는 true입니다. 설명된 사실은 아래 다이어그램에서 더 잘 이해할 수 있습니다.

문자열 힙 메모리 및 상수 풀 할당 설명

마찬가지로 equals 방법이 두 인스턴스에 모두 적용되면 부울 true 값이 됩니다. 이 함수는 내용 비교에서 작동하므로 동일합니다.

다음으로 다른 문자열 str3 변수는 new 키워드를 사용하여 초기화됩니다. JVM은 str3 변수에 인스턴스를 할당하는 대신 name 주소에 대한 힙 메모리에 내부적으로 새 공간을 만듭니다. 따라서 내용 비교가 이루어지면 equals 함수에서 true를 반환합니다. == 연산자를 사용하여 주소를 비교하면 false를 반환합니다.

다음은 위의 코드 블록의 출력입니다.

true
true
true
false
Rashmi Patidar avatar Rashmi Patidar avatar

Rashmi is a professional Software Developer with hands on over varied tech stack. She has been working on Java, Springboot, Microservices, Typescript, MySQL, Graphql and more. She loves to spread knowledge via her writings. She is keen taking up new things and adopt in her career.

LinkedIn

관련 문장 - Java String