HOWTO · Java
Java의 string.equals() 대 == 비교
이 기사에서는 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