String
, StringBuffer
, StringBuilder
String | StringBuffer | StringBuilder | |
---|---|---|---|
저장 위치 | String pool(Flyweight Pattern, java 7 이상 Heap에 위치) | Heap | Heap |
Mutable | X | O | O |
Thread Safe | O | O | X |
String
String
의 경우 불변(immutable) 객체이므로 객체 자체에 수정을 할 수 없다. 따라서 +
와 같은 연산을 했을 때, 해당 주소값에 직접 append
하는 것이 아니라 append
한 문자열을 새로운 공간에 할당하고 기존 문자열은 참조를 하나 잃게 되는 것이다.
추가로 리터럴 할당과 new
키워드 할당의 차이가 있다. new
로 생성할 경우 string pool에 해당 문자열이 있어도 새로 할당하게 된다.
StringBuffer
/ StringBuilder
StringBuffer
와 StringBuilder
는 가변 객체이며, 해당 객체 주소값에 직접 문자열을 append
하게 된다.
StringBuffer
vs StringBuilder
Thead Safe에서 차이가 있다. Multi thread 환경이면 StringBuffer
를 쓰도록 하자.
String
연산을 사용한다면 Java 5 이상에서는 컴파일러에서 StringBuilder
로 최적화를 시도한다. 그러나 String
덧셈을 반복문안에서 하는 상황같은 경우에는 객체를 계속 추가하는 것은 변함없다. 따라서 String
조작을 해야할 경우, StringBuilder
와 StringBuffer
를 멀티 스레드 환경을 고려하여 사용하는 것을 권장한다.
개발자가 반드시 알아야 할 자바 성능 튜닝 이야기 3장
https://starkying.tistory.com/entry/what-is-java-string-pool
https://starkying.tistory.com/entry/why-java-string-is-immutable
https://ifuwanna.tistory.com/221
https://madplay.github.io/post/difference-between-string-stringbuilder-and-stringbuffer-in-java