버퍼(buffer)
라고 하는 독립적인 공간을 가진다.// 아무 값도 가지고 있지 않은 StringBuffer 객체를 생성
StringBuffer sb = new StringBuffer();
// 해당 스트링 버퍼에 "hello", 공백, "world"를 차례대로 추가
sb.append("hello");
sb.append(" ");
sb.append("world");
// StringBuffer에 추가된 값을 toString()메소드를 이용하여 반환
String str = sb.toString();
> str = hello world
메소드 체이닝
메소드체이닝
이라고 한다.// 앞의 코드를 한 줄의 코드로!
// 메소드 체이닝
String str2 = new StringBuffer().append("hello").append(" ").append("world").toString();
System.out.println(str2);
출력 > hello world
요약
String
클래스의 인스턴스는 한 번 생성되면 그 값을 읽기만 할 수 있고, 변경할 수는 없다.StringBuffer
클래스의 인스턴스는 그 값을 변경할 수도 있고, 추가할 수도 있다.- 덧셈(+) 연산자를 이용해 String 인스턴스의 문자열을 결합하면, 내용이 합쳐진 새로운 String 인스턴스를 생성한다. 따라서
문자열(string)
을 많이 결합하면 결합할수록 공간의 낭비뿐만 아니라 속도 또한 매우 느려지게 된다.
하지만StringBuffer
인스턴스를 사용하면 문자열을 바로 추가할 수 있으므로, 공간의 낭비도 없으며 속도도 매우 빨라진다.
String str1 = "hello world";
String str2 = str1.substring(5); // 5번째부터 문자열을 잘라서 새로운 문자열 반환
System.out.println(str1);
System.out.println(str2);
// String클래스를 사용할 때 가장 문제가 발생하는 경우
String str3 = str1 + str2;
System.out.println(str3);
출력 > hello world
world
hello world world
String str4 = new StringBuffer().append(str1).append(str2).toString();
문자열을 반복문 안에서 더하는 것은 성능상 문제가 생길 수 있으니 반드시 피하는 것이 좋다!
=> StringBuffer 이용
public class StringBufferPerformanceTest{
public static void main(String[] args){
// (1) String의 +연산을 이용해서 10,000개의 *를 이어붙입니다.
//시작시간을 기록합니다.(millisecond단위)
long startTime1 = System.currentTimeMillis();
String str="";
for(int i=0;i<10000;i++){
str=str+"*";
}
//종료시간을 기록합니다.(millisecond단위)
long endTime1 = System.currentTimeMillis();
// (2) StringBuffer를 이용해서 10,000개의 *를 이어붙입니다.
//시작시간을 기록합니다.(millisecond단위)
long startTime2 = System.currentTimeMillis();
StringBuffer sb = new StringBuffer();
for(int i=0;i<10000;i++){
sb.append("*");
}
//종료시간을 기록합니다.(millisecond단위)
long endTime2 = System.currentTimeMillis();
// 방법(1)과 방법(2)가 걸린 시간을 비교합니다.
long duration1 = endTime1-startTime1;
long duration2 = endTime2-startTime2;
System.out.println("String의 +연산을 이용한 경우 : "+ duration1);
System.out.println("StringBuffer의 append()을 이용한 경우 : "+ duration2);
}
}
출력 〉 String의 +연산을 이용한 경우 : 24
StringBuffer의 append()을 이용한 경우 : 1