> Java > java지도 시간 > Java에서 String, StringBuffer 및 StringBuilder 문자열 클래스 구별

Java에서 String, StringBuffer 및 StringBuilder 문자열 클래스 구별

高洛峰
풀어 주다: 2017-01-22 10:06:48
원래의
1454명이 탐색했습니다.

1 문자열
문자열: 문자열 상수, 문자열 길이는 변경할 수 없습니다.

2 StringBuffer
StringBuffer: 문자열 변수(동기화됨, 즉 스레드로부터 안전함). 문자열 내용을 자주 수정하려면 효율성을 위해 StringBuffer를 사용하는 것이 가장 좋습니다. 문자열 형식으로 변환하려면 StringBuffer의 toString() 메서드를 호출하면 됩니다.
Java.lang.StringBuffer 스레드로부터 안전한 변경 가능 문자 시퀀스입니다. 언제든지 특정 문자 시퀀스가 ​​포함되지만 해당 시퀀스의 길이와 내용은 특정 메서드 호출을 통해 변경될 수 있습니다. 문자열 버퍼는 여러 스레드에서 안전하게 사용할 수 있습니다.
StringBuffer의 주요 작업은 모든 유형의 데이터를 허용하도록 오버로드될 수 있는 추가 및 삽입 메서드입니다. 각 방법은 지정된 데이터를 문자열로 효과적으로 변환한 다음 해당 문자열의 문자를 문자열 버퍼에 추가하거나 삽입합니다. 추가 방법은 항상 이러한 문자를 버퍼의 끝에 추가합니다. 삽입 방법은 지정된 지점에 문자를 추가합니다. 예를 들어, z가 현재 내용이 "start"인 문자열 버퍼 개체를 참조하는 경우 이 메서드 호출 z.append("le")는 문자열 버퍼에 "startle"을 포함하게 하는 반면 z.insert(4, " le")는 "starlet"을 포함하도록 문자열 버퍼를 변경합니다.

3 StringBuilder
StringBuilder: 문자열 변수(스레드로부터 안전하지 않음).
java.lang.StringBuilder는 JDK5.0에 새로 추가된 가변 문자 시퀀스입니다. 이 클래스는 StringBuffer 호환 API를 제공하지만 동기화를 보장하지는 않습니다. 이 클래스는 문자열 버퍼가 단일 스레드에서 사용될 때(일반적인 상황) StringBuffer에 대한 드롭인 대체품으로 설계되었습니다. 대부분의 구현에서 StringBuffer보다 빠르기 때문에 가능하면 이 클래스를 선호하는 것이 좋습니다. 두 방법 모두 기본적으로 동일합니다.
대부분의 경우 StringBuilder > StringBuffer입니다.

4 세 가지 차이점
String 유형과 StringBuffer의 주요 성능 차이: String은 불변 객체이므로 String 유형이 변경될 때마다 새로운 String 객체가 생성되고, 포인터가 새 String 개체를 가리키도록 하므로 내용을 자주 변경하는 문자열에는 String을 사용하지 않는 것이 가장 좋습니다. 개체가 생성될 때마다 시스템 성능에 영향을 미치기 때문입니다. 특히 참조되지 않는 개체가 너무 많으면 더욱 그렇습니다. 메모리, JVM의 GC는 작동을 시작하자마자 성능이 저하됩니다.
StringBuffer 클래스를 사용하면 새 객체를 생성하고 객체 참조를 변경하는 대신 매번 StringBuffer 객체 자체에 작업이 수행됩니다. 따라서 대부분의 경우, 특히 문자열 객체가 자주 변경되는 경우에는 StringBuffer를 사용하는 것이 좋습니다.
일부 특별한 경우에는 String 객체의 문자열 연결이 실제로 JVM에 의해 StringBuffer 객체의 연결로 해석되므로 이러한 경우 String 객체의 속도는 StringBuffer 객체의 속도보다 느리지 않습니다. 예를 들면 다음과 같습니다.

String S1 = “This is only a” + “ simple” + “ test”;
StringBuffer Sb = new StringBuilder(“This is only a”).append(“ simple”).append(“ test”);
로그인 후 복사

String S1 객체 생성 속도는 StringBuffer보다 느리지 않습니다. 실제로 JVM에서는 다음 변환이 자동으로 수행됩니다.

String S1 = “This is only a” + “ simple” + “test”;
로그인 후 복사

JVM은 위 명령문을

String S1 = “This is only a simple test”;
로그인 후 복사

로 직접 처리합니다. 그래서 매우 빠릅니다. 그러나 연결된 문자열이 다른 String 객체에서 오는 경우 JVM은 이를 자동으로 변환하지 않으며 속도도 그다지 빠르지 않습니다. 예:

String S2 = “This is only a”;
String S3 = “ simple”;
String S4 = “ test”;
String S1 = S2 +S3 + S4;
로그인 후 복사

때때로 JVM은 원래 방식으로 작동합니다.
대부분의 경우 StringBuffer > String입니다.

4. StringBuffer와 StringBuilder
는 거의 차이가 없습니다. 기본적으로 StringBuffer는 스레드로부터 안전하며 대부분의 내부 메서드가 호출된다는 점입니다. 키워드 동기화가 앞에 오면 StringBuilder는 스레드로부터 안전하지 않으므로 더 효율적입니다.

public static void main(String[] args) throws Exception {
    String string = "0";
    int n = 10000;
    long begin = System.currentTimeMillis();
    for (int i = 1; i < n; i++) {
      string += i;
    }
    long end = System.currentTimeMillis();
    long between = end - begin;
    System.out.println("使用String类耗时:" + between+"ms");
  
    int n1 = 10000;
    StringBuffer sb = new StringBuffer("0");
    long begin1 = System.currentTimeMillis();
    for (int j = 1; j < n1; j++) {
      sb.append(j);
    }
    long end1 = System.currentTimeMillis();
    long between1 = end1 - begin1;
    System.out.println("使用StringBuffer类耗时:" + between1+"ms");
  
    int n2 = 10000;
    StringBuilder sb2 = new StringBuilder("0");
    long begin2 = System.currentTimeMillis();
    for (int k = 1; k < n2; k++) {
      sb2.append(k);
    }
    long end2 = System.currentTimeMillis();
    long between2 = end2 - begin2;
    System.out.println("使用StringBuilder类耗时:" + between2+"ms");
  }
로그인 후 복사

출력:

使用String类耗时:982ms
使用StringBuffer类耗时:2ms
使用StringBuilder类耗时:1ms
로그인 후 복사

이 숫자는 실행될 때마다 다르지만 각각의 상황 machine 동일하지는 않지만 몇 가지 확실한 점은 String 클래스가 다른 두 클래스보다 훨씬 더 많은 것을 소비한다는 것입니다. 또 다른 요점은 StringBuffer가 StringBuilder보다 더 많은 것을 소비한다는 것입니다. 그러나 차이점은 분명하지 않습니다.


5 사용 전략
(1) 기본 원칙: 적은 양의 데이터를 처리하려면 String을 사용하고, 단일 스레드로 많은 양의 데이터를 처리하려면 StringBuilder를 사용합니다. 멀티스레드로 많은 양의 데이터를 연산하고 싶다면 StringBuffer를 사용하세요.
(2) String 클래스의 "+"는 성능이 매우 낮기 때문에 사용하지 마십시오. 이는 Java 최적화에서 중요한 원칙입니다. 예를 들어, String을 사용하는 경우 문자열을 연결할 때 "+"를 사용하여 JVM에 임시 StringBuffer 객체를 생성합니다. 동시에 두 문자열을 연결하려면 총 4개가 생성되어야 합니다. . 물체! (결과를 저장하기 위한 문자열, 두 개의 문자열 개체 및 임시 StringBuffer 개체). StringBuffer를 사용할 때는 객체를 2개만 생성하면 됩니다! StringBuffer 객체와 최종 결과를 보유하는 String 객체.
(3) 더 나은 성능을 얻으려면 StirngBuffer 또는 StirngBuilder를 구성할 때 용량을 최대한 지정해야 합니다. 물론, 연산하고 있는 문자열의 길이가 16자를 넘지 않는다면 이는 필요하지 않습니다. 용량을 지정하지 않으면 성능이 크게 저하될 수 있습니다.
(4) StringBuilder는 일반적으로 "+"와 유사한 기능을 완성하기 위해 메서드 내에서 사용됩니다. 스레드에 안전하지 않기 때문에 사용 후 폐기될 수 있습니다. StringBuffer는 주로 전역 변수에 사용됩니다.
(5) StirngBuilder를 사용하면 동일한 상황에서 StringBuffer를 사용하는 것과 비교하여 약 10%~15% 정도의 성능 향상을 얻을 수 있지만 멀티스레딩이 불안정해질 위험이 있습니다. 실제 모듈러 프로그래밍에서는 특정 모듈을 담당하는 프로그래머가 해당 모듈이 멀티스레드 환경에서 실행될지 여부를 반드시 명확하게 판단할 수 없는 경우가 있습니다. 따라서 시스템의 병목 현상이 StringBuffer에 있다고 판단되지 않는 한, 모듈이 다중 스레드 모드에서 실행되지 않는 경우에만 StringBuilder를 사용할 수 있습니다. 그렇지 않으면 StringBuffer가 계속 사용됩니다.

Java의 String, StringBuffer 및 StringBuilder 문자열 클래스 분석에 대한 더 많은 기사를 보려면 PHP 중국어 웹사이트에 주목하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿