String | StringBuffer | StringBuilder | |
---|---|---|---|
저장위치 | StringPool | Heap | Heap |
Modifiable | 불변 | 가변 | 가변 |
thread-safe | O | O | X |
동기화 | O | O | X |
성능 | 빠름 | 느림 | 빠름 |
String : 문자열 연산이 적고 멀티쓰레드 환경일 경우
StringBuffer : 문자열 연산이 많고 멀티쓰레드 환경일 경우
StringBuilder : 문자열 연산이 많고 단일쓰레드이거나 동기화를 고려하지 않아도 되는 경우
📌 불변(immutable)
, Strnig pool
불변 = 한 번 저장된 값이 절대 변하지 않는다.
String str = "hello";
str = str + "world";
System.out.println(str); //hello world
String 객체 생성하는 방식은 new String()
, 리터럴("")
이 있다.
intern()
메소드 호출된다.intern()
@Test
public void stringInternTest() {
String a = "Hello";
String b = new String("Hello");
System.out.println("a == b ? : " + (a == b)); // false
System.out.println("a == b.intern() ? : " + (a == b.intern())); // true
}
-> intern()
메서드를 사용하면 메모리 낭비를 줄일 수 있다.
캐싱 기능에 의한 메모리 절약과 속도 향상
thread-safe
보안기능
하지만, 문자열 추가,수정,삭제와 같은 연산이 많아지면 힙에 Garbage가 많이 생성되고 힙 메모리 부족으로 성능이 저하될 수 있다. 그래서, StringBuffer
, StringBuilder
클래스가 도입됨.
📌 가변
, append()
, delete()
메소드 사용
StringBuffer sb = new StringBuffer("hello");
sb.append("world");
StringBuffer
synchronized
) 지원)block
상태가 됨block
-> running
상태로 변하고 sb의 append()접근 및 실행StringBuilder
//////////StringBuffer//////////
@Override
public synchronized StringBuffer append(String str) {
toStringCache = null;
super.append(str);
return this;
}
//////////StringBuilder///////////
@Override
public StringBuilder append(String str) {
super.append(str);
return this;
}
신입 개발자 기술면접 질문 정리 - 자바
[Java] String, StringBuffer, StringBuilder 차이와 장단점
what is java String pool
자바스프링 풀
StringBuffer와 StringBuilder는 무슨 차이가 있는가