본문 바로가기
카테고리 없음

[JAVA] StringBuffer 와 StringBuilder

by 잉ㅈI 2024. 1. 29.

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());