"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > Java의 StringBuilder 및 StringBuffer

Java의 StringBuilder 및 StringBuffer

2024년 11월 21일에 게시됨
검색:699

StringBuilder vs StringBuffer in Java

Java에서는 변경 가능 문자열(수정 가능한 문자열)로 작업할 때 StringBuilder와 StringBuffer 중에서 선택해야 할 수도 있습니다. 둘 다 해당 값을 수정할 수 있는 변경 가능한 클래스이지만 스레드 안전성, 성능 및 애플리케이션 측면에서 크게 다릅니다. 여기에서는 각 특성을 비교하고 각 특성을 언제 사용해야 하는지 설명하는 코드 예제를 제공합니다.


주요 차이점: StringBuilder와 StringBuffer

특징 StringBuilder 문자열 버퍼
가변성 변하기 쉬운 변하기 쉬운
저장 위치: 힙(문자열 풀을 사용하지 않음) 힙(문자열 풀을 사용하지 않음)
스레드 안전성 스레드로부터 안전하지 않음 스레드로부터 안전함
동기화 동기화되지 않음 동기화됨
성능 더 빨라짐 동기화 부족으로 인해 동기화 오버헤드로 인해 속도가 느려짐
사용 사례 단일 스레드 시나리오 스레드 안전성이 필요한 멀티스레드 시나리오

각 수업을 좀 더 자세히 살펴보겠습니다.


1. StringBuilder: 단일 스레드 환경을 위한 효율적인 선택

  • StringBuilder는 변경 가능한 클래스입니다. 즉, 해당 콘텐츠를 수정할 수 있습니다.

  • 스레드가 안전하지 않으므로 단일 스레드 시나리오에 이상적입니다.

  • 동기화되지 않음: 동기화 오버헤드가 없기 때문에 StringBuilder가 StringBuffer보다 빠릅니다.

  • 멀티 스레드 제한: 추가 안전 조치 없이 멀티 스레드 환경에서 StringBuilder를 사용하면 경합 조건 및 기타 동시성 문제가 발생할 수 있습니다.

예: StringBuilder에서 스레드의 안전성 입증

이 예에서는 두 개의 스레드를 사용하여 StringBuilder 인스턴스에 문자를 추가합니다. 그러나 동기화 부족으로 인해 경합 조건:
이 발생합니다.

public class StringBuilderBasics {

    public void threadUnsafe() {
        // Common resource being shared
        StringBuilder builder = new StringBuilder();

        // Thread appending "A" 1000 times
        Thread t1 = new Thread(() -> {
            for (int i = 0; i  {
            for (int i = 0; i 



설명:

  • 스레드 안전성으로 인해 StringBuilder 출력의 최종 길이를 예측할 수 없습니다(예: 2000 대신 1840 ).

  • 이는 두 스레드가 동시에 문자를 추가하려고 시도하여 덮어쓰기 또는 삭제된 작업으로 이어지기 때문에 발생합니다.

요점: 단일 스레드 환경이나 스레드 안전성이 외부에서 처리되는 경우에만 StringBuilder를 사용하세요.


2. StringBuffer: 멀티스레드 환경을 위한 안전한 옵션

  • StringBuffer는 변경 가능하여 해당 내용을 수정할 수 있습니다.

  • 동기화되어 스레드로부터 안전합니다.

  • 스레드 안전성이 필요한 멀티 스레드 환경에 이상적입니다.

  • 성능 비용: 동기화로 인해 오버헤드가 발생하므로 StringBuffer는 StringBuilder보다 느립니다.

예: StringBuffer의 스레드 안전성

여기 위와 같은 예가 있지만 이번에는 StringBuffer를 사용합니다:

public class StringBufferBasics {

    public void threadSafe() {
        // Common resource being shared
        StringBuffer buffer = new StringBuffer();

        // Thread appending "A" 1000 times
        Thread t1 = new Thread(() -> {
            for (int i = 0; i  {
            for (int i = 0; i 



설명:

  • StringBuffer는 두 스레드가 모두 안전하게 추가되어 예상 길이인 2000을 달성하도록 보장합니다.

  • 최종 문자열은 스레드로부터 안전하지만 스레드 실행 순서는 비결정적이므로 출력은 인터리브(예: "AAABBB..."를 함께 혼합)할 수 있습니다..

요점: 데이터 일관성이 중요하고 동기화가 필요한 멀티스레드 애플리케이션에 StringBuffer를 사용하세요.


올바른 수업 선택

StringBuilder와 StringBuffer 중 하나를 결정하려면 다음을 고려하세요.

  • 성능이 중요하고 스레드 안전성이 문제가 되지 않는 단일 스레드 시나리오에서 StringBuilder를 사용하세요.

  • 변경 가능한 문자열 작업이 필요하고 경합 조건을 피하기 위해 스레드 안전성이 필요한 멀티 스레드 시나리오에서 StringBuffer를 사용하세요.


결론

이 비교는 StringBuilder와 StringBuffer 사이에서 정보를 바탕으로 선택하는 데 도움이 됩니다. 가변성, 성능 및 스레드 안전성의 장단점을 이해하면 Java에서 문자열을 사용할 때 더 나은 의사 결정을 내릴 수 있습니다.


관련 게시물

  • 자바 기초
  • 어레이 인터뷰 필수사항
  • Java 메모리 필수사항
  • Java 키워드 필수
  • Java OOP 필수사항
  • 수금 프레임워크 필수사항

즐거운 코딩하세요!

릴리스 선언문 이 기사는 https://dev.to/arshisaxena26/stringbuilder-vs-stringbuffer-in-java-4jlb ?1에서 재현됩니다.
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3