JAVA

String 리터럴 방식, new연산자 방식 / 문자열 비교 equals ==

se0nghyun2 2023. 2. 8. 18:00

<정리 목적>

 person.getName() == NAME.SEONGHYUN 비교 시 true로 생각 했으나 false반환

-> 좀더 확인 및 상세히 기재 필요


자바에선 String을 선언하는 방식이 두 가지 존재한다.

  • new 연산자방식
  • 리터럴 방식

둘의 차이를 알아본다.

더보기

String s1 = new String("seonghyun"); //new연산자 방식

String s2 = "seonghyun"; //리터럴 형식

String s3 = "gildong"; //리터럴 형식

 

1. 메모리 할당 영역

 - 리터럴 방식 : heap영역 안 String constant pool

 - new연산자 방식 : heap영역

메모리 할당 상태

 

2. 선언 시 할당 및 참조 방식

-리터럴 방식

내부적으로 String의 intern()메서드 호출되어, 문자열이 String constant pool에 존재하는지 확인 후

 존재하면 해당 주소값 반환

 존재하지 않는다면 새로운 주소값으로 할당한다.

=> 메모리 절약 및 속도 향상!!

 

- new연산자 방식 

입력된 문자 상관없이 새로운 주소 값으로 할당한다.


자바 문자열 비교 == , equals()

 

== 주소값 비교

equals 값 자체 비교

//==
if(s1==s2) System.out.print("== 동일")
else Stystem.out.print("== 다름")

//equals
if(s1.equals(s2)) System.out.print("equals 동일")
else Stystem.out.print("equals 다름")


//결과
==다름
equals 동일

위 그림(메모리할당상태 그림)과 같이

== 의 경우 주소값을 비교하기에 else 타고

equals 해당 값 자체를 비교하기에 if를 타서 해당 결과를 반환한다.

 

따라서 실제 값 자체를 비교하고 싶으면 equals를 사용하도록 하자!!!