String str1 = "abc";
String str2 = "abc";
String str3 = new String("abc");
String str4 = new String("abc");

str1, str2

  • 문자열을 리터럴로 선언하면, 자바 컴파일러가 String Constant Pool 영역에 저장한다.
  • 같은 값의 문자열의 주소를 공유하여 메모리 사용량을 최적화 한다.

str3, str4

  • new 연산자를 사용하여 새로운 문자열 객체를 생성하면 Heap 영역에 저장되며 다른 주소를 할당 받는다.

==

==연산자는 두 문자열의 주소값이 같은지 비교한다.

String str1 = "abc";
String str2 = "abc";
String str3 = new String("abc");
 
System.out.println(str1 == str2); // true
System.out.println(str1 == str3); // false
  • 두 객체가 메모리에서 동일한 위치를 가리키는지 확인한다.

equals()

두 문자열의 내용을 비교한다.

String str1 = "abc";
String str2 = "abc";
String str3 = new String("abc");
 
System.out.println(str1.equals(str2)); // true
System.out.println(str1.equals(str3)); // true
  • 두 문자열이 동일한 값을 가지고 있는지를 확인한다.