StringBuilder는 가변 String으로, 불변 String의 문제를 해결할 수 있다.
StringBuilder 내부를 살펴보면, final
이 아닌 변경할 수 있는 byte[]
를 가지고 있다.
public final class StringBuilder
extends AbstractStringBuilder
implements java.io.Serializable, Comparable<StringBuilder>, CharSequence
{ ... }
abstract class AbstractStringBuilder implements Appendable, CharSequence {
byte[] value;
...
}
append()
: 문자열 추가insert()
: 특정 위치에 문자열 삽입delete()
: 특정 범위의 문자열 삭제reverse()
: 문자열 뒤집기StringBuilder sb = new StringBuilder();
sb.append("Hello,");
sb.append("World!");
System.out.println(sb); // Hello, World!
sb.delete(0,12);
System.out.println(sb); // !
sb.append("AB");
System.out.println(sb); // !AB
sb.reverse();
System.out.println(sb); // BA!
// StringBuilder -> String 변환
String str = sb.toString();
String str = "Hello, " + "World!";
String str = "Hello, World!";
// str1, str2가 객체인지 리터럴 문자열인지 알 수 없음
String result1 = str1 + str2;
// StringBuilder를 사용하여 최적화 수행
String result2 = new StringBuilder().append(str1).append(str2).toString();
String과 StringBuilder 각각을 사용하여 100000회 hello
를 더했을 때, 각각 약 2.5초와 약 0.003초가 걸렸다.
long startTime = System.currentTimeMillis();
String str = "";
for (int i = 0; i < 100000; i++) {
str += "hello";
/**
* str = new StringBuilder().append(str).append("hello").toString();
* 의 방법으로 최적화 된다.
*/
}
long endTime = System.currentTimeMillis();
System.out.println(endTime - startTime); // 2490ms
long startTime = System.currentTimeMillis();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 100000; i++) {
sb.append("hello");
}
String str = sb.toString();
long endTime = System.currentTimeMillis();
System.out.println(endTime - startTime); // 3ms
java 9부터는 StringConcatFactory를 사용해서 최적화를 수행한다.
public static CallSite makeConcatWithConstants(MethodHandles.Lookup lookup,
String name,
MethodType concatType,
String recipe,
Object... constants)
throws StringConcatException
{ ... }
메서드 체이닝(Method Chaning)은 자기 자신의 참조값을 반환하면서 이를 새로운 변수에 담지 않고, 바로 메서드를 호출하여 사용하는 방법이다.
public class MethodChaning {
public static void main(String[] args) {
ValueAdder adder = new ValueAdder();
int str = adder.add(10).add(20).add(30).getvalue();
System.out.println(str); // 60
}
}
public class ValueAdder {
private int value;
public ValueAdder add(int addValue) {
value += addValue;
return this;
}
public int getValue() {
return value;
}
}
public class MethodChaining2 {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
String str = sb.append("a").append("b).append("c")
.insert(3, "java")
.delete(3,7)
.reverse()
.toString();
System.out.println(str); // cba
}
}