1. String vs StringBuffer 와 StringBuilder
- String : 불변성(Immutable)갖음 - 할당된 공간이 변하지 않음
- StringBuffer, StringBuilder : 가변성(mutable)갖음 - 할당된 공간이 변함
String str = new String("hello"); (1)
str = str + " world"; //hello world (2)
(1)에서는 str --> hello 를 가르켜 메모리 주소가 할당
(2)에서는 str --> hello world를 가르켜 메모리 주소가 할당
이때 hello 값이 들어간 메모리영역 != hello world 값이 들어간 메모리영역
(즉, hello 값이 들어간 메모리영역은 Garbage가 된다!)
변하지않은 문자열을 추가, 수정, 삭제 처럼 연산이 자주 일어난다면 Heapapahfldp Garbage가 생성 (좋지않음)
StringBuffer, StringBuilder 을 사용하여 현재 문자열을저장하는 배열의 공간을 늘리고, 추가한 문자열을 넣어주자!
2. StringBuffer vs StringBuilder
- stringBuffer
- 동기화 키워드 지원
- 멀티쓰레드 환경에서 안전(string도 멀티쓰레드환경의 경우 좋음)
- StringBuilder
- 동기화 키워드 지원X
- 멀티쓰레드 환경에서 적합하지X
- 단일쓰레드환경에서는 StringBuffer 보다 성능 good
3. StringBuilder 와 StringBuffer사용법
거의 흡사하다
1) 선언하기
StringBuffer sb = new StringBuffer();
//StringBuffer sb = new StringBuffer("aaa"); //aaa로 버퍼초기화 가능
StringBuilder sb = new StringBuilder();
//StringBuilder sb = new StringBuilder("aaa"); //aaa로 빌더초기화 가능
import java.util.* 후 사용 가능하다!
2)문자열 추가
sb.append("hello"); //hello
sb.append(4) //hello4
3)문자열 삽입
sb.insert(int offset, String str);
sb.insert(2,"ccc"); //hecccllo4
두번째인덱스("e"와 "l"사이 "ccc" 삽입)
4)문자열 자르기
파라미터 1개 : start 부터 끝까지 인덱싱
파라미터 2개 : start 부터 end -1 까지 인덱싱
sb.substring(int start);
sb.substring(int start, int end);
sb.substring(5); //hecccllo4 -> llo4
sb.substring(3,7); //hecccllo4 -> cccll
문자열 자르기는 빌더에 저장된 값들이 변하지 않는다!
즉, print할때 쓰이거나 따로 저장해야한다!
5)인덱스에 위치한 문자하나 삭제
sb.deleteCharAt(int index);
sb.deleteCharAt(3);
6)문자열 삭제
start부터 end - 1 까지 문자삭제
sb.delete(int start, int end);
sb.delete(3, 6);
7)문자열 뒤집기
sb.reverse(); //4ollccceh
8)문자열 변환
sb.toString();
9.StringBuilder 비우기 - 2가지 방법
sb.setLength(0);
sb.delete(0, sb.length());