String vs StringBuffer vs StringBuilder

Onni·2021년 8월 9일
1

String

  • Constant Pool을 이용
    기존에 있던 문자열에 추가가 아니라 계속해서 새로운 String을 생성
    한번 String에 만들어지면 Constant Pool에 고정. 변형이 일어나면 변형된 새로운 Constant가 만들어진다
String a = "Hello World";
String b = "Hello World";
System.out.pritln(a == b); //reference가 같은지 비교 
  • String 에 대해서는 += 연산을 사용하지 말자
    String a="" ;
        for(int i =0; i < 10; i++){ 
            a += i; 
        }

변하지 않는 문자열을 자주 읽어들이는 경우 String을 사용
추가,수정,삭제 등의 연산이 빈번하게 발생하는 경우 힙메모리 부족으로 어플리케이션 성능에 치명적인 영향
=> StringBuffer/StringBuilder 도입

StringBuffer vs StringBuilder

  • 모든 조합 해놓고 Constant Pool 에는 한번만 등록
 StringBuffer sb = new StringBuffer();
for(int i =0; i < 10; i++){ 
            sb.append(i); 
        }

StringBuffer

  • 동기화가 되어있다(멀티쓰레드에 안전)

  • String처럼 문자형 배열(char[])을 내부적으로 가지고 있다

  • 그러나 String과 달리 변경할 수 있다.(가변)

  • append()는 지정된 내용을 StringBuffer에 추가 후 , StringBuffer의 참조를 반환

  • String 클래스는 불변하기 때문에 문자열을 수정하는 시점에 새로운 String인스턴스 생성

    • 공간이 부족하면 새로운 배열 생성
    • StringBuffer는 저장할 문자열의 길이를 고려해서 적절한 크기로 생성
    • equals()가 오버라이딩되지않다. (주소비교)
    StringBuffer sb = new StringBuffer("abc");
        StringBuffer sb = new StringBuffer("abc");

        System.out.println(sb.equals(sb2)); //false

        //String으로 변환후에 equals() 비교 가능
        String s = sb.tostring();
        String s2 = sb2.tostring();

        System.out.println(s.equals(s2)); //true

StringBuilder

  • 동기화 되어있지 않다.

  • 멀티쓰레드 프로그램이 아닌경우 동기화는 불필요한 성능저하

    → 이럴 때 StringBuffer 대신 StringBuilder 사용하면 성능 향상


    String : 문자열 연산이 적고 멀티쓰레드 환경
    StringBuffer : 문자열 연산이 많고 멀티쓰레드 환경
    StringBuilder : 문자열 연산이 많고 단일쓰레드이거나 동기화를 고려하 지 않을 경우

profile
꿈꿈

0개의 댓글