문제점
- String 클래스는 문자열을 다룰 때 사용하는 클래스
- String 클래스는 불변 클래스이다
Code
public class StringExam {
public static void main(String[] args) {
String str1="hello world";
String str2= str1.substring(5);
System.out.println(str1);
System.out.println(str2);
String str3=str1+str2;
System.out.println(str3);
String str4=new StringBuffer().append(str1).append(str2).toString();
System.out.println(str4);
String str5="";
for(int i=0;i<10;i++){
str5=str5+"*";
}
System.out.println(str5);
StringBuffer sb=new StringBuffer();
for(int i=0;i<10;i++){
sb.append("*");
}
System.out.println(sb.toString());
}
}
- String 객체의 불변성으로 인하여 반복문을 실행할 때 마다 새로운 String 객체가 생성됨
- 계속해서 새로운 문자열이 생성되므로 메모리 할당과 해제가 반복적으로 발생 -> 성능 저하
- 해결: StringBuilder 클래스나 StringBuffer 를 사용하여 해결 가능
Code 실습
public class StringBufferPerformanceTest{
public static void main(String[] args){
long startTime1 = System.currentTimeMillis();
String str="";
for(int i=0;i<10000;i++){
str=str+"*";
}
long endTime1 = System.currentTimeMillis();
long startTime2 = System.currentTimeMillis();
StringBuffer sb = new StringBuffer();
for(int i=0;i<10000;i++){
sb.append("*");
}
long endTime2 = System.currentTimeMillis();
long duration1 = endTime1-startTime1;
long duration2 = endTime2-startTime2;
System.out.println("String의 +연산을 이용한 경우 : "+ duration1);
System.out.println("StringBuffer의 append()을 이용한 경우 : "+ duration2);
}
}
결과

- 시간 복잡도(성능)에서 StringBuffer가 String보다 훨씬 유리함