티스토리 뷰
문자열 리스트가 주어졌을 때 이 문자열들을 하나로 이어 붙이는데 걸리는 시간은?
String joinWords(String[] words) {
String sentence = "";
for (String w : words) {
sentense += w;
}
return sentence;
}
문자열을 이어붙일 때마다 두 개의 문자열을 읽어 들인 뒤 문자를 하나하나 새로운 문자열에 복사해야 한다.
처음에는 1개, 두 번째는 2개, 세 번째는 3개, n번째는 n개를 복사해야 한다.
따라서 총 수행 시간은 아래와 같이 된다.
StringBuilder가 이 문제를 해결해 줄 수 있다. StringBuilder는 가변 크기 배열을 이용하여 필요한 경우에만 문자열을 복사하게 해준다.
String joinWords(String[] word) {
StringBuilder sentence = new StringBuilder();
for (String w : words) {
sentence.append(w);
}
return sentence.toString();
}
이와 같이 구현할 경우 총 수행 시간은 이 된다
StringBuilder의 메모리 확장
StringBuilder는 크기를 미리 설정하지 않은 경우에 내부적으로 설정한 크기를 넘어서는 경우 전체 크기를 두 배로 늘리므로, 최종 크기가 실제 크기보다 더 클 수도 있다. 따라서 StringBuilder를 생성 할 때 크기를 미리 설정할 수 있다면 하는것이 좋다.
StringBuilder와 StringBuffer의 차이
StringBuilder는 동기화를 보장하지 않는다.(async)
StringBuffer는 StringBuilder보다 속도가 느리지만, 동기화를 보장해(sync) 주어 멀티쓰레드(Multi Thread) 환경에서 안전하다.
참고문헌
- [자료구조 알고리즘] 자바의 StringBuilder에 대해 알아보고 구현하기