티스토리 뷰

프로그래밍/Java

String vs StringBuilder vs StringBuffer

푸르른강물을먹이를찾아어슬렁거리는연어처럼 2020. 2. 11. 23:12

String 의 특징

String str = "abc";

//is equivalent to
char data[] = {'a', 'b', 'c'};
String str = new String(data);

//more examples
System.out.println("abc");
String cde = "cde";
System.out.println("abc" + cde);
String c = "abc".substring(2,3);
String d = cde.substring(1, 2);

string은 문자열을 저장하고 관리하는 기본적인 클래스입니다. 다른 두 클래스와 가장 큰 차이점은 바로 가변적이지 않다는 것입니다.(immutable) 이러한 특징에서, + 연산이나 concat 등을 이용해서 문자열에 변화를 주게 되면 본래의 메모리 공간은 변하지 않고 새로운 String 객체를 생성하는 것입니다. 이러한 방식의 단점은 기존 메모리 공간의 낭비(가비지 콜렉터에 의해 제거되기를 기다려야 함 언제 제거될지 모름)를 유발합니다.

String test1 = "Hello ";
String test2 = "world";
System.out.println("결과");
System.out.println("test1 : " + test1);
System.out.println("test2 : " + test2);
System.out.println("test1의 주소공간 : " + test1.hashCode());
System.out.println("test2의 주소공간 : " + test2.hashCode());

test1 = test1 + test2;
System.out.println("test1 + test2의 주소공간 : " + test1.hashCode());

결과

test1 : Hello
test2 : world
test1의 주소공간 : -2137068114
test2의 주소공간 : 113318802
test1 + test2의 주소공간 : -832992604

대신, 불변하는 String의 특징은 고정된 값이 단순하게 읽히는 연산에서는 다른 클래스에 비해 빠르게 읽을 수 있는 장점이 있습니다.

StringBuffer 의 특징

StringBufferString Class와 구별되는 가장 큰 특징은 수정이 가능하다는 것입니다. 또한, StringBuffer의 가장 큰 특징은 thread-safe입니다. StringBufferStringBuilder와 비교할 때 multiple thread에서 동기화를 보장합니다.

StringBuilder 의 특징

StringBuilder Class 또한 String Class와 구별되는 특징은 수정이 가능하다는 것입니다. 하지만 StringBuffer와는 다르게, thread-safe를 보장하지 않습니다. 이는 multiple-thread 상황에서는 안정성을 위해 StringBuffer를 이용해야 한다는 것을 의미합니다. 반대로, single-thread가 보장되는 상황이라면 비교적 더 빠른 StringBuilder를 쓰는 것이 좋습니다. StringBuilder는 single-thread 상황이라면 StringBuffer와 비교하여 대부분의 경우에서 더 빠릅니다.

StringBuffer와 StringBuilder Multi-thread test

StringBuffer stringBuffer = new StringBuffer();
StringBuilder stringBuilder = new StringBuilder();

new Thread(() -> {
    for(int i=0; i<10000; i++) {
        stringBuffer.append(i);
        stringBuilder.append(i);
    }
}).start();

new Thread(() -> {
    for(int i=0; i<10000; i++) {
        stringBuffer.append(i);
        stringBuilder.append(i);
    }
}).start();

new Thread(() -> {
    try {
        Thread.sleep(50000);

        System.out.println("StringBuffer.length: "+ stringBuffer.length());
        System.out.println("StringBuilder.length: "+ stringBuilder.length());
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}).start();

StringBuffer.length: 77780
StringBuilder.length: 77623

StringBuffer와 StringBuilder Single-thread test

public static void main(String[] args) {
        stringBufferTest();
        stringBuilderTest();
    }
    public static void stringBufferTest() {
          long startTime = System.nanoTime();
          StringBuffer sb = new StringBuffer();
          for (int i=0; i < 1000; i++) {
             sb.append((char) 'a');
          }
          System.out.println("StringBuffer test time : " + (System.nanoTime() - startTime));
       }
       public static void stringBuilderTest() {
          long startTime = System.nanoTime();
          StringBuilder sb = new StringBuilder();
          for (int i=0; i < 1000; i++) {
             sb.append((char) 'a');
          }
          System.out.println("StringBuilder test time : " + (System.nanoTime() - startTime));
       }

StringBuffer test time : 71101
StringBuilder test time : 27101

출처

https://docs.oracle.com/javase/8/docs/api/java/lang/String.html

https://docs.oracle.com/javase/8/docs/api/java/lang/StringBuffer.html

https://docs.oracle.com/javase/8/docs/api/java/lang/StringBuffer.html

https://novemberde.github.io/2017/04/15/String_0.html

https://www.tutorialspoint.com/how-can-we-compare-a-stringbuilder-with-stringbuffer-in-java

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
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
글 보관함