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를 타서 해당 결과를 반환한다.