끄적끄적
[java]String 생성과 메모리 본문
String의 생성 방식
1. new 연산자를 이용한 방식
- String s = new String("str1");
- Heap 영역에 생성
2. 리터럴을 이용한 방식
- String literal = "str2";
- String 상수풀에 생성.
- String을 리터럴로 선언하게 되면 내부적으로 String의intern()메서드 호출
- String.intern()
- 주어진 문자열이 String 상수풀에 있는지 검색하고 있으면 주소값 반환, 없으면 새로 추가하고 새로운 주소값 반환
constant pool의 위치 변경
- java 6: perm 영역
- java 8: Perm 영역은 사라지고 Heap 영역 (perm은 고정된 사이즈고 Runtime에 사이즈가 확장되지 않는다. OutofMemoryException문제때문에 변경) -> GC의 대상
java 9 Compact String(압축 문자열)
- String이 JVM의 힙 공간의 많은 부분을 찿지 한다.
- 압축 문자열로 메모리 소비를 최적화 하기 위해 설계되었다.
- 라틴으로 표시 가능한 문자열을 byte로 변환 (coder의 역할)
- 기존 char [] -> byte[]
== 과 equals 비교
- equals는 최상위 클래스 Object에 포함되어 있어 모든 하위 클래스에서 재정의해서 사용할 수 있다.
- String 클래스에서 equals()는 문자열의 내용이 같으면 true를 리턴하도록 재정의 되어있다.
- == 연산자는 int, boolean 과 같은 프리미티브 타입에 대해서는 상수풀에서 값에 대한 주소를 비교한다. reference 타입에 대해서는 주소값을 비교한다.
String 클래스가 final인 이유
- 상수풀에서 객체를 공유해 생성되는 String 객체를 줄여 메모리를 절약.
'CS 공부' 카테고리의 다른 글
thread와 런에이블 (0) | 2022.03.20 |
---|---|
[java] static (0) | 2022.03.18 |
[java] 배열 리스트의 동적 동작 (0) | 2022.03.17 |
[java]final 키워드 (0) | 2022.03.17 |
[java]JVM의 구조 (0) | 2022.03.17 |
Comments