>  기사  >  Java  >  Java의 StringBuilder 및 StringBuffer

Java의 StringBuilder 및 StringBuffer

Susan Sarandon
Susan Sarandon원래의
2024-11-18 03:19:02850검색

StringBuilder vs StringBuffer in Java

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


주요 차이점: StringBuilder와 StringBuffer

기능 StringBuilder 문자열 버퍼
Feature StringBuilder StringBuffer
Mutability Mutable Mutable
Stored in Heap (does not use String Pool) Heap (does not use String Pool)
Thread Safety Not thread-safe Thread-safe
Synchronization Not synchronized Synchronized
Performance Faster due to lack of synchronization Slower due to synchronization overhead
Use Case Single-threaded scenarios Multi-threaded scenarios where thread-safety is required
가변성 변경 가능 변경 가능 저장 위치 힙(문자열 풀을 사용하지 않음) 힙(문자열 풀을 사용하지 않음) 스레드 안전성 스레드로부터 안전하지 않음 스레드로부터 안전함 동기화 동기화되지 않음 동기화 성능 더 빠릅니다 동기화 부족으로 인해 동기화 오버헤드로 인해 속도가 느려짐 사용 사례 단일 스레드 시나리오 스레드 안전성이 필요한 멀티스레드 시나리오

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


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 < 1000; i++) {
                builder.append("A");
            }
        });

        // Thread appending "B" 1000 times
        Thread t2 = new Thread(() -> {
            for (int i = 0; i < 1000; i++) {
                builder.append("B");
            }
        });

        t1.start();
        t2.start();

        try {
            t1.join();
            t2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // Result: 1840 (unpredictable)
        System.out.println("Length: " + builder.toString().length());
    }

    public static void main(String[] args) {
        new StringBuilderBasics().threadUnsafe();
    }
}

설명:

  • 스레드 안전성으로 인해 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 < 1000; i++) {
                buffer.append("A");
            }
        });

        // Thread appending "B" 1000 times
        Thread t2 = new Thread(() -> {
            for (int i = 0; i < 1000; i++) {
                buffer.append("B");
            }
        });

        t1.start();
        t2.start();

        try {
            t1.join();
            t2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // Result: 2000
        System.out.println("Length: " + buffer.toString().length());
    }

    public static void main(String[] args) {
        new StringBufferBasics().threadSafe();
    }
}

설명:

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

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

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


올바른 수업 선택

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

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

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


결론

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


관련 게시물

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

즐거운 코딩하세요!

위 내용은 Java의 StringBuilder 및 StringBuffer의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.