[JAVA] String VS StringBuilder VS StringBuffer

String VS StringBuilder VS StringBuffer

소스로 비교해보기

  • example
public static void main(String[] args) {
    String s1 = "hello";
    concat1(s1);  // s1 is not changed
    System.out.println("String: " + s1);

    StringBuilder s2 = new StringBuilder("hello");
    concat2(s2); // s2 is changed
    System.out.println("StringBuilder: " + s2);

    StringBuffer s3 = new StringBuffer("hello");
    concat3(s3); // s3 is changed
    System.out.println("StringBuffer: " + s3);
}

// Concatenates to String
public static void concat1(String s1) {
    s1 = s1 + "world";
}

// Concatenates to StringBuilder
public static void concat2(StringBuilder s2) {
    s2.append("world");
}

// Concatenates to StringBuffer
public static void concat3(StringBuffer s3) {
    s3.append("world");
}
  • output
String: hello
StringBuilder: helloworld
StringBuffer: helloworld

(Concat1) String : immutable, synchronization

  • main ()에서 전달 된 문자열은 변경되지 않음.
  • String이 변경 불가능
  • string의 값을 변경하면 다른 객체가 생성되고 concat1 ()의 s1은 새 문자열의 참조를 저장
  • main () 및 cocat1 ()의 s1 참조는 다른 문자열을 참조

(Concat2) StringBuilder : mutable , Asynchronous

  • 문자열의 실제 값 (main)을 변경하는 s2.append(“world”)를 수행
  • StringBuilder가 변경 가능 하므로 값이 변경 된다는 단순한 사실

(Concat3) StringBuffer : mutable, synchronization

  • StringBuffer는 StringBuffer가 스레드로부터 안전하다는 한 가지 차이점을 제외하면 StringBuilder와 유사
  • 즉, 여러 스레드가 아무런 문제없이 사용가능
  • 스레드 안전성은 성능 저하를 가져옴

StringBuilder > StringBuffer > String

사용

  • 문자열이 프로그램 전체에서 일정하게 유지되는 경우 String 개체는 변경할 수 없으므로 String 클래스 개체를 사용
  • 문자열이 변경 될 수 있고 (예 : 문자열 생성시 많은 논리 및 작업) 단일 스레드에서만 액세스 할 수있는 경우 StringBuilder를 사용하는 것으로 충분
  • 문자열이 변경 될 수 있고 여러 스레드에서 액세스 될 경우 StringBuffer가 동기식이므로 스레드 안전성이 있으므로 StringBuffer를 사용하

References

https://www.geeksforgeeks.org/string-vs-stringbuilder-vs-stringbuffer-in-java/

Tags:

Categories:

Updated: