Java StringBuilder 생성자
1. StringBuilder 생성자
StringBuilder 클래스에는 4개의 생성자가 있다.
StringBuilder()
: 최대 16자를 입력할 수 있는 빈 문자열 빌더를 생성한다.StringBuilder(int capacity)
: 지정된 문자 용량으로 빈 문자열 빌더를 생성한다. 이는 문자열 빌더에 필요한 용량을 알고 있을 때 용량을 늘리는데 시간을 절약하는데 유용하다.StringBuilder(String str)
: 문자열 인수와 동일한 문자를 갖는 새로운 문자열 빌더를 생성한다. 문자열 빌더의 초기 용량은 “str의 길이 + 16”이다.StringBuilder(CharSequence seq)
: CharSequence와 동일한 문자로 새 문자열 빌더를 만든다. 문자열 빌더의 초기 용량은 “seq의 길이 + 16”이다.
위의 생성자를 사용하여 StringBuilder 객체를 만드는 몇 가지 예이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class JavaStringBuilder {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
System.out.println(sb.capacity());
System.out.println(sb);
StringBuilder sb1 = new StringBuilder(1000);
System.out.println(sb1.capacity());
System.out.println(sb1);
StringBuilder sb2 = new StringBuilder("Java");
System.out.println(sb2.capacity());
System.out.println(sb2);
CharSequence seq = new StringBuilder("String");
StringBuilder sb3 = new StringBuilder(seq);
System.out.println(sb3.capacity());
System.out.println(sb3);
}
}
2. StringBuilder 용량
StringBuilder는 바이트 배열을 사용하여 문자를 저장한다.
StringBuilder를 초기화하면 바이트 배열도 초기화된다.
바이트 배열의 크기는 생성자를 통해 지정할 수 있다.
바이트 배열의 기본 용량은 16이다.
기존 용량보다 많은 문자를 문자열 빌더에 추가하면 바이트 배열은 더 큰 용량과 기존 콘텐츠로 다시 초기화된다.
StringBuilder에 필요한 용량에 대한 아이디어가 있다면 생성자를 사용하여 필요한 초기 용량을 지정한다. 바이트 배열 재셔플이 필요하지 않기 때문에 StringBuilder 작업이 더 빨라진다.
3. StringBuilder에서 문자열로
StringBuilder에서 toString()
메서드를 호출하여 문자열 표현을 얻을 수 있다.
1
2
3
4
5
6
7
public class JavaStringBuilder {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder("Hello");
String str = sb.toString();
System.out.println(str);
}
}
4. StringBuilder 메서드
StringBuilder 메서드는 다음과 같은 범주로 나눌 수 있다.
append()
: StringBuilder에 원시형과 객체를 추가하는 여러 오버로드된 메서드. 데이터는 항상 문자열 빌더의 끝에 추가된다.insert()
: 주어진 인덱스에 문자를 삽입하는데 사용된다. 특정 유형의 인수에 대해 여러 개의 오버로드된 메서드가 있다.delete()
: 문자열 빌더에서 문자를 삭제하는데 사용된다.replace()
: 문자열 버퍼에 있는 문자를 바꾼다.reverse()
: 문자 시퀀스를 역순으로 바꾼다. String 클래스에는reverse()
메서드가 없기 때문에 문자열을 역순으로 바꾼다.기타 메서드:
compareTo()
,indexOf()
,lastIndexOf()
1) StringBuilder append()
문자열 빌더에 기본 데이터 유형을 추가하는 append()
메서드가 있다. append(Object)
메서드를 호출하여 문자열 빌더에 객체 문자열 표현을 추가할 수 있다.
인수가 객체인 경우, toString()
메서드를 사용하여 문자열 표현을 가져온다. 문자열 빌더에 문자 배열을 추가하는 방법이 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public class JavaStringBuilder {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
// append primitive data types
sb.append('a'); // append char
sb.append(true); // append boolean
sb.append(10); // append int
sb.append(12345L); // append long
sb.append(10.20); // append double
sb.append(10.20f); // append float
System.out.println(sb.toString());
// append char array
char[] charArray = {'a', 'b', 'c', 'd'};
sb.append(charArray); // append complete char array
sb.append(charArray, 1, 2); // will append index 1 and 2
System.out.println(sb);
// append Objects
sb.append(new Object());
System.out.println(sb);
// append String, CharSequence
sb.append("Hello");
sb.append(new StringBuilder("Hi"));
sb.append(new StringBuilder("JavaString"), 4, 10);
System.out.println(sb);
}
}
2) StringBuilder insert()
append()
메서드와 마찬가지로 여러 개의 오버로드된 insert()
메서드가 있다.
첫 번째 인수는 두 번째 인수가 삽입될 인덱스를 정의한다. 인덱스 인수는 0보다 크거나 같아야 하고, 문자열 빌더의 길이보다 작거나 같아야 한다. 그렇지 않으면 StringIndexOutOfBoundsException이 throw된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class JavaStringBuilder {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
// insert primitive data types
sb.insert(0, 'a'); // insert char
sb.insert(1, 10); // insert int
sb.insert(1, 10.20f); // insert float
System.out.println(sb.toString());
// insert char array
char[] charArray = {'1', '2', '3'};
sb.insert(1, charArray); // insert complete char array
sb.insert(3, charArray, 1, 2); // will insert index 1 and 2
System.out.println(sb);
// insert String, CharSequence
sb.insert(9, "Java");
sb.insert(10, new StringBuilder("String"));
sb.insert(11, new StringBuilder("Developer"), 4, 6);
System.out.println(sb);
}
}
3) StringBuilder delete()
StringBuilder에는 문자를 삭제하는 두 가지 방법이 있다.
delete(int start, int end)
: 인덱스 start부터 end까지 문자 시퀀스를 삭제한다.deleteCharAt(int index)
: 지정된 인덱스에 있는 문자를 삭제한다.
StringBuilder의 delete() 메서드를 사용하는 방법이다.
1
2
3
4
5
6
7
8
9
public class JavaStringBuilder {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder("Hello World");
sb.delete(6, 11);
System.out.println(sb);
sb.deleteCharAt(4);
System.out.println(sb);
}
}
4) StringBuilder replace()
replace 메서드 구문은 다음과 같다. replace(int start, int end, String str)
시작 및 종료 매개변수는 str 콘텐츠로 대체될 문자열 버퍼의 인덱스를 정의한다. 먼저 인덱스 사이의 문자가 제거된다. 그런 다음 지정된 문자열이 시작 인덱스에 삽입된다.
1
2
3
4
5
6
7
8
public class JavaStringBuilder {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder("Hello World 2019");
System.out.println(sb);
sb.replace(6, 11, "JavaString");
System.out.println(sb);
}
}
5) StringBuilder reverse()
이 방법은 문자 시퀀스를 역순으로 바꾼다. 매우 유용하다.
1
2
3
4
5
6
7
public class JavaStringBuilder {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder("Hello");
sb.reverse();
System.out.println(sb);
}
}
6) StringBuilder 기타 메서드
int compareTo(StringBuilder another)
: 두 StringBuilder 인스턴스를 사전식으로 비교하는데 사용된다.int indexOf(String str)
,indexOf(String str, int fromIndex)
: 문자열 빌더에서 문자열의 첫 번째 발생을 찾는데 사용된다.int lastIndexOf(String str)
: 문자열 빌더에서 하위 문자열이 나타나는 마지막 인덱스를 찾는데 사용된다.int lastIndexOf(String str, int fromIndex)
: 지정된 인덱스에서 시작하여 뒤로 검색하여 지정된 하위 문자열의 마지막 발생 위치의 인덱스를 반환한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class JavaStringBuilder {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder("Hello Jello Trello");
StringBuilder sb1 = new StringBuilder("Hello Trello");
System.out.println(sb.compareTo(sb1));
System.out.println(sb.indexOf("ll"));
System.out.println(sb.indexOf("ll", 6));
System.out.println(sb.lastIndexOf("o"));
System.out.println(sb.lastIndexOf("o", 6));
}
}
4. StringBuilder vs StringBuffer
StringBuilder는 스레드로부터 안전하지 않지만 StringBuffer는 스레드로부터 안전하다.
StringBuilder 메서드는 동기화가 없기 때문에 StringBuffer 메서드보다 빠르다.
StringBuilder에는 StringBuilder 클래스에 있는 쓸모없는 메서드가 없다. 예를 들어,
substring()
,length()
등.StringBuilder는 Java 1.5에서 도입되었고, StringBuffer는 Java 1.0부터 존재한다.
단일 스레드 문자열 조작에는 StringBuilder가 권장되고, 다중 스레드 문자열 조작에는 StringBuffer가 권장된다.