처음부터 차근차근
문자열 합 성능 비교 본문
자바에서 문자열을 합치는 방법에는 크게 4가지가 있다.
1. + 연산자
2. String class의 concat() 메서드
3. String class의 append() 메서드
4. String class의 format() 메서드
간단한 코드를 작성해 각각의 연산속도를 비교해봤다.
public class Main
{
public static void main(String[] args) {
// 변수
long start, end, time = 0;
// +
start = System.nanoTime();
String str = "";
for (int i = 0; i < 10000; i++) {
str += "ab";
}
end = System.nanoTime();
time = end - start;
System.out.println("+ 연산자 걸린 시간 : " + time);
System.out.println("********************************");
// concat()
start = System.nanoTime();
String concatStr = "";
for (int i = 0; i < 10000; i++) {
concatStr.concat("ab");
}
end = System.nanoTime();
time = end - start;
System.out.println("concat() 걸린 시간 : " + time);
System.out.println("********************************");
// append()
start = System.nanoTime();
StringBuilder builder = new StringBuilder();
for (int i = 0; i < 10000; i++) {
builder.append("ab");
}
end = System.nanoTime();
time = end - start;
System.out.println("append() 걸린 시간 : " + time);
System.out.println("********************************");
// format()
start = System.nanoTime();
String formatStr = "";
for (int i = 0; i < 10000; i++) {
formatStr.format("%s", "ab");
}
end = System.nanoTime();
time = end - start;
System.out.println("format() 걸린 시간 : " + time);
System.out.println("********************************");
}
}
결과 : append > concat, format > +
+ 연산자로 한 것이 가장 비효율적이고, StringBuilder의 append() 메서드를 사용한 것이 가장 효율적인 것을 볼 수 있다.
자바는 + 연산을 사용하면 컴파일 전에 내부적으로 StringBuilder 객체를 생성해서 연산한다고 한다.
// 그래서 이것은
String str = "";
for (int i = 0; i < 10000; i++) {
str += "ab";
}
// 이것과 같다
String str = "";
for (int i = 0; i < 10000; i++) {
str = new StringBuilder(str).append("ab").toString();
}
+ 연산자를 써도 어차피 StringBuilder로 변환되니 간단한 문자열 연산을 제외한 다른 경우에는 StringBuilder의 append()메서드를 사용하는 것이 더 좋은 코드를 작성하는 데 도움이 될 것같다.
그리고 concat() 메서드는 문자열을 추가할 때마다 새로운 인스턴스를 생성하기 때문에 성능이나 속도면에서 좋지 않다고 한다.
concat 함수
public String concat(String var1) {
int var2 = var1.length();
if (var2 == 0) {
return this;
} else {
int var3 = this.value.length;
char[] var4 = Arrays.copyOf(this.value, var3 + var2);
var1.getChars(var4, var3);
return new String(var4, true);
}
}
concat()은 컴파일러에서 변환을 수행하지 않아 + 연산자 보다는 빠르지만 내부적으로 배열을 사용하고, 인스턴스를 새로 생성하기 때문에 concat을 쓰는 것 보다는 StringBuilder를 사용하는 것이 권장된다.
[JAVA] StringBuilder의 append(), String의 + 연산자 속도차이
StringBuilder의 append()와 String의 +연산자의 속도차이 자바에서 String은 변경이 안되는 객체이기 때문에 +연산을 하면 내부적으로 새 메모리를 할당받아서 사용한다고 한다. 그래서 String의 변경이 많
january-diary.tistory.com
https://pellegrino.link/2015/08/22/string-concatenation-with-java-8.html
String concatenation with Java 8
String concatenation is one of the most well-known caveats in Java. Almost all experienced Java developers have already heard or read explanations about when to use String vs StringBuilder/StringBuffer for concatenating Strings. These last months I gave so
pellegrino.link
'프로그래밍 > JAVA' 카테고리의 다른 글
자바 지역변수 자동 초기화에 대하여 (0) | 2022.09.02 |
---|---|
static 자료형과 메모리 영역 (0) | 2022.07.31 |
String 초기화 : 리터럴 방식과 new 방식의 차이 (0) | 2022.05.01 |