알고리즘 문제풀이 중 , String에 문자를 추가해가는 문제에서 시간초과가 발생함.
String 은 "+" 연산을 이용하여 문자열을 계속 이어붙일 수 있다. 하지만 이렇게하면 String 객체가 계속 생성됨.
String str = "abc" + "def";
// "abc" "def" 객체가 생성되어 이어짐
// 루프내에서 사용하면 성능저하 심함
StringBuilder를 사용하면 내부의 객체를 수정하여 이어붙이므로. 효율이 좋다.
테스트코드.
StringTest는 loop가 백만번이 넘어가면 매우매우 느려진다..
private static void StringTest(int num) {
System.out.println("#### StringTest() ####");
System.out.println("input num >> " + num);
long startTime = System.nanoTime();
String a = "";
for (int i = 0; i < 4000000; i++) {
a += i;
}
long endTime = System.nanoTime();
long duration = (endTime - startTime);
double milliseconds = duration / 1_000_000.0;
// 실행 시간 출력
System.out.println(">>> " + duration + " ns");
System.out.println(">>> " + milliseconds + " ms");
System.out.println("#### END ####");
}
private static void StringBuilderTest(int num) {
System.out.println("#### StringBuilderTest() ####");
System.out.println("#### StringTest() ####");
System.out.println("input num >> " + num);
long startTime = System.nanoTime();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < num; i++) {
sb.append(i);
}
long endTime = System.nanoTime();
long duration = (endTime - startTime); // 나노초 단위
double milliseconds = duration / 1_000_000.0; // 밀리초로 변환
// 실행 시간 출력
System.out.println(">>> " + duration + " ns");
System.out.println(">>> " + milliseconds + " ms");
System.out.println("#### End ####");
}
10만번 실행 결과
약 1000배정도의 성능차이를 보여줌

100만번 실행 결과
약 25000배 (ㄷㄷ)

결론 : 문자열 많이붙일땐 StringBuilder 쓰자.!