백준 알고리즘과 프로그래머스 코딩테스트를 작성하면서 String의 substring을 활용하며 문제를 해결하다가 효율성이 떨어지는 것을 느꼈다.
그래서 찾아보니 문자열을 StringBuilder나 StringBuffer를 통해 append하는 것이 많았다. 이 클래스에 대한 정보를 정리하기 위한 글을 작성하기로 하였다.
String
- 문자열
- implements Serializable, Comparable, CharSequence
- jdk 1.5 이후부터 +연산은 StringBuilder 사용해 성능 최적화 (단, 여러줄에 걸쳐 +할 경우 StringBuilder도 여러 번 선언)
1
2
3
4
5
|
public final class String implements Serializable,
Comparable<String>, CharSequence {
private final char[] value;
...
}
|
cs |
위의 코드를 살펴보자char형의 배열을 final로 선언한 것이 보인다.
이렇게 String 주소값이 stack에 쌓이고 클래스는 Garbage Collector 호출되기 전까지
heap에 지속적으로 쌓이는 구조이다.
StringBuffer
- thread-safe 하고, 변경 가능한 문자열
- implements Serializable, CharSequence
- web이나 소켓 환경 같은 비동기 동작이 많은 경우에 자주 사용한다.
StringBuilder
- 변경 가능한 문자열
- implements Serialiazable, CharSequenceStringBuffer와 StringBuilder에서 + 연산 대신 사용하는 함수
append()
- value에 사용되지 않고 남아있는 공간에 새로운 문자열이 들어갈 정도의 크기가 있다면 그대로 삽입한다!!
- 그렇지 않다면 value 배열의 크기를 두배로 증가시키면서 기존의 문자열을 복사하고 새로운 문자열을 삽입한다.
참조 :
https://docs.oracle.com/javase/7/docs/api/java/lang/package-summary.html
https://novemberde.github.io/2017/04/15/String_0.html
https://cjh5414.github.io/why-StringBuffer-and-StringBuilder-are-better-than-String/
'Back-End > Java' 카테고리의 다른 글
[Java] EnumMap 정리 (0) | 2023.11.23 |
---|---|
[Java] Java 11 vs Java 17, JDK 17 정리 (0) | 2023.10.14 |
[Java] 함수 파라미터의 final 키워드를 사용하는 이유 (0) | 2023.05.08 |
[자료구조] Java 우선순위 큐(Priority Queue) (0) | 2023.02.03 |