[Java] String과 new String 차이
String 문자열 생성 방식
String str1 = new String("Hello");
String str2 = "Hello";
String str3 = "Hello";
1. new 이용한 문자열 생성
2. 문자열 리터럴 생성
두 방식의 차이점
두 방식의 가장 큰 차이점은 메모리 영역에 있다.
new 연산자를 통해 String을 생성하면 Heap 영역에 존재하게 되고, 리터럴을 이용할 경우 string constant pool이라는 영역에 존재하게 된다. (아래 그림 참고)
똑같은 "Hello" 문자열을 사용하는 데 변수 str2 와 str3은 같은 객체를 바라보지만 new String으로 생성한 str1은 다른 메모리 주소의 객체를 바라보는 것이다.
문자열을 비교해보면,
String str1 = new String("Hello");
String str2 = "Hello";
String str3 = "Hello";
System.out.println(str1.equals(str2)); // true
System.out.println(str1 == str2); // false
System.out.println(str2 == str3); // true
str1과 str2는 두 변수가 가리키는 객체의 문자열은 "Hello" 인데, 왜 == 연산의 경우 false가 나오는 걸까?
equals 연산자는 단순 문자열을 비교한다면, == 연산자는 두 객체의 주소값을 비교하기 때문에
new 연산자를 통해 Heap 영역에 생성된 String str1과 리터럴을 이용해 String constant Pool 영역에 위치한 String str2과의 주소값은 같을 수가 없는 것이다 !
참고로 Java6까지 string constant pool의 위치는 Perm 영역이었다. Perm 영역에 위치하였던 게 Java7에서 Heap 영역으로 변경되었다.
출처 : https://haenny.tistory.com/18
'JAVA > Java' 카테고리의 다른 글
[Java] 특정문자로 문자열 나누기 split 사용방법과 주의점 (0) | 2022.11.15 |
---|---|
[Java] StartsWith/EndWith : 문자열의 시작/끝 부분과 특정 문자열이 일치하는지 확인하기 (0) | 2022.11.15 |
[Java] StringBuffer append("a"+"b") 메모리는 어떻게 할당될까? (0) | 2022.11.15 |
[Java] String, StringBuffer, StringBuilder의 차이점 (0) | 2022.11.15 |
java Default Method(인터페이스 디폴트 메소드) (0) | 2022.04.26 |
java 이메일 마스킹 처리 (0) | 2022.04.26 |
java 휴대폰번호 마스킹 처리 (0) | 2022.04.26 |
문자에서 숫자만 추출 (0) | 2022.04.26 |