Java에서 문자열을 합치는 방법에는 여러 가지가 있습니다.
이번에는 + 연산자, StringBuilder 클래스의 append 메소드, String.join 메소드, 그리고 StringBuffer 클래스의 append 메소드를 이용하여 문자열을 합치는 성능을 비교해보겠습니다.
이 중에서 가장 빠른 방법은 무엇일지 알아 보겠습니다.
int numOfTests = 10;
int numOfIterations = 1_000_000;
long[] elapsedTime = new long[4];
for (int i = 0; i < numOfTests; i++) {
elapsedTime[0] += measureConcatenation(numOfIterations);
elapsedTime[1] += measureStringBuilder(numOfIterations);
elapsedTime[2] += measureStringJoin(numOfIterations);
elapsedTime[3] += measureStringBuffer(numOfIterations);
}
System.out.println("Average Time:");
System.out.println("+ 연산자: " + elapsedTime[0] / numOfTests + "ms");
System.out.println("StringBuilder: " + elapsedTime[1] / numOfTests + "ms");
System.out.println("String.join: " + elapsedTime[2] / numOfTests + "ms");
System.out.println("StringBuffer: " + elapsedTime[3] / numOfTests + "ms");
private static long measureConcatenation(int numOfIterations) {
long start = System.currentTimeMillis();
String result = "";
for (int i = 0; i < numOfIterations; i++) {
result += Integer.toString(i);
}
long end = System.currentTimeMillis();
return end - start;
}
private static long measureStringBuilder(int numOfIterations) {
long start = System.currentTimeMillis();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < numOfIterations; i++) {
sb.append(Integer.toString(i));
}
String result = sb.toString();
long end = System.currentTimeMillis();
return end - start;
}
private static long measureStringJoin(int numOfIterations) {
long start = System.currentTimeMillis();
List<String> list = new ArrayList<>();
for (int i = 0; i < numOfIterations; i++) {
list.add(Integer.toString(i));
}
String result = String.join("", list);
long end = System.currentTimeMillis();
return end - start;
}
private static long measureStringBuffer(int numOfIterations) {
long start = System.currentTimeMillis();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < numOfIterations; i++) {
sb.append(Integer.toString(i));
}
String result = sb.toString();
long end = System.currentTimeMillis();
return end - start;
}
Average Time:
+ 연산자: 1260ms
StringBuilder: 4ms
String.join: 15ms
StringBuffer: 21ms
위의 결과를 보면, + 연산자를 이용한 방법이 가장 느리고, StringBuilder 클래스의 append 메소드를 이용한 방법이 가장 빠릅니다. 그리고 String.join 메소드와 StringBuffer 클래스의 append 메소드는 비슷한 성능을 보입니다.
StringBuilder 클래스의 append 메소드String.join은 내부적으로 StringBuilder를 이용하여 문자열을 합치기 때문에, 성능상 이점이 있습니다. 또한 가변인자(varargs)를 이용하여 여러 개의 문자열을 합치는 것도 가능합니다.StringBuffer는 내부적으로 synchronized를 이용하여 동기화 처리를 하기 때문에, 멀티스레드 환경에서 안전하게 사용할 수 있습니다. 그러나 StringBuilder보다는 성능이 떨어지기 때문에, 단일 스레드 환경에서는 StringBuilder를 사용하는 것이 좋습니다.