[JAVA] String / StringBuffer / StringBuilder
String Literal vs String object
String s1 = new String("ava"); //heap영역에 “java”문자열을 가진 String 객체 생성
String s2 = new String("java"); //heap영역에 “java”문자열을 가진 String 객체 생성
String s3 = "java"; //String literal pool에 “java” 저장
String s4 = "java"; //jvm이 String literal pool에 동일한 값이 있는지 확인후, 있으면 가리킨다.
- 연산자 ==는
주소값
을 비교한다.
s1 == s2 // false
s3 == s4 // true
- 값을 비교하고 싶다면? equals()사용
s1.equals(s2) // true
intern()
String s1=new String("test").intern();
- String객체에 intern을 사용하면 literal pool에 해당 문자열이 있는지 검사하여 생성된 객체를 버리고 바로 해당 리터널 풀의 문자열 주소를 참조하게 된다. 단점) 동일 문자열이 있는지 검사 시간 소요 해당 문자열이 없다면 리터럴 풀에 새로 등록되기 때문에 많이 쓰이지 않는 문자열이면 메모리 낭비가 일어남
- 왜쓰는지 노이해
String vs StringBuffer vs StringBuilder
String
- 불가변적 (immutable)
- String은 메모리에 배열로 저장된다. (배열 – 불가변) 변경불가! --> 동시에 참조되기때문에 새롭게 추가됨 & 배열은 불가변 - 스트링 리터널은 동시에 참조되기때문에 변경마다 새로운 객체가 생성된다 -> 효율떨어짐 --> 그래서 StringBuffer와 StringBuilder가 생겼다.
String testStr = "Hello Word"
testStr="Hello"
이렇게 하면 2번째 줄에서 새로운 메모리 공간(String literal pool)에 “Hello”가 저장되고 testStr가 그것을 가리키게 된다.
- JDK 1.5 버전 이후 컴파일 단계에서 String객체의 문자열 연산을 사용할 경우 StringBuilder로 변경된다.
StringBuffer, StringBuilder
공통점
- 가변적 (mutable) – 크기가 자유롭다.
- 변경 시, 기존의 객체에서 문자열 변경이 일어난다.
StringBuffer
- 크기를 지정하지 않으면 16으로 할당됨. 그후 모자라면 16*2 됨
- 동기화 보장 (multi thread)
StringBuilder
- 동기화 보장 X (Single Thread)
==> 문자열 변경의 빈도 횟수가 낮을 경우 String
==> 문자열 변경 연산이 빈번하다면 StringBuffer, StringBuilder 사용하는 것이 좋다.
(String literal도 GC대상????????)
-->JDK7부터 PermGen의 Constant Pool에 생성되던 String literal pool이 Heap Area에 생성되는 것으로 바뀌었다고…
Area: HotSpot
Synopsis: In JDK 7, interned strings are no longer allocated in the permanent generation of the Java heap, but are instead allocated in the main part of the Java heap (known as the young and old generations), along with the other objects created by the application. This change will result in more data residing in the main Java heap, and less data in the permanent generation, and thus may require heap sizes to be adjusted. Most applications will see only relatively small differences in heap usage due to this change, but larger applications that load many classes or make heavy use of the String.intern() method will see more significant differences.
RFE: 6962931
http://www.oracle.com/technetwork/java/javase/jdk7-relnotes-418459.html#jdk7changes
'JAVA > JAVA' 카테고리의 다른 글
[JVAV] BigInteger 클래스 (0) | 2018.07.09 |
---|---|
[JAVA] 2진수, 8진수, 16진수 (0) | 2018.07.09 |
[JAVA] Modifiers, Contructor (0) | 2017.09.18 |
[JAVA] JAVA 특징 (0) | 2017.09.18 |
[JAVA] JVM 메모리 관리 (0) | 2017.09.03 |