Java의 String 및 StringBuffer 및 StringBuilder 문자열 클래스 분석

1 String
String: 문자열 상수, 문자열 길이는 변경할 수 없습니다.
2 StringBuffer
StringBuffer: 문자열 변수(Synchronized, 즉 스레드 보안).문자열 내용을 자주 수정하려면 효율적으로 StringBuffer를 사용하는 것이 좋습니다. String 형식으로 바꾸려면 StringBuffer의 toString () 방법을 사용할 수 있습니다.
Java.lang. StringBuffer 스레드가 안전한 가변 문자 시퀀스입니다.임의의 시간에 특정한 문자 서열을 포함하지만, 어떤 방법으로 호출하면 이 서열의 길이와 내용을 바꿀 수 있다.문자열 버퍼를 여러 스레드에 안전하게 사용할 수 있습니다.
StringBuffer의 주요 동작은 append와 insert 방법입니다. 이 방법을 다시 불러와서 임의의 형식의 데이터를 받아들일 수 있습니다.모든 방법이 효과적으로정해진 데이터를 문자열로 변환한 다음 문자열의 문자를 문자열 버퍼에 추가하거나 삽입합니다.append 방법은 항상 이 문자를 버퍼의 끝에 추가합니다.insert 방법은 지정한 점에 문자를 추가합니다.예를 들어 z가 현재 내용이 "start"인 문자열 버퍼 대상을 인용하면, 이 방법은 z.append ("le") 를 호출하면 문자열 버퍼에 "startle"을 포함하고, z.insert (4, "le") 는 문자열 버퍼를 변경해서 "startlet"을 포함합니다.
3 StringBuilder
StringBuilder: 문자열 변수(비스레드 보안).
java.lang. StringBuilder는 JDK5.0에 추가된 가변 문자 시퀀스입니다.이 유형은 동기화를 보장하지 않으면서 StringBuffer와 호환되는 API를 제공합니다.이 클래스는 문자열 버퍼가 한 라인에서 사용될 때 사용되는 StringBuffer의 간단한 교체로 설계되었습니다.가능하다면, 이 종류를 우선적으로 채택할 것을 건의합니다. 왜냐하면?대부분의 구현에서 StringBuffer보다 빠릅니다.양자의 방법은 기본적으로 같다.
대부분의 경우 StringBuilder > StringBuffer.
4 삼자 차이
String 유형과 String Buffer의 주요 성능 차이점: 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는 라인이 안전하다는 것이다. 내부의 대다수 방법 앞에 키워드synchronized가 있다. 그러면 일정한 성능 소모가 있을 것이다. 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
이 숫자는 매번 실행할 때마다 다르고 기계마다 상황이 다르지만 몇 가지 확실한 것은 String류가 다른 두 개보다 훨씬 많이 소모된다는 것이다.또 하나는 String Buffer가 String Builder보다 소모가 많다는 것이다. 비록 차이가 뚜렷하지는 않지만.
5 정책 사용
(1) 기본 원칙: 소량의 데이터를 조작하려면 String을 사용한다.단일 스레드로 대량의 데이터를 조작하고 StringBuilder를 사용합니다.다중 스레드는 StringBuffer를 사용하여 대량의 데이터를 조작합니다.
(2) String 클래스의 "+"를 사용하지 마십시오. 왜냐하면?그럼성능이 매우 나쁘면 StringBuffer나 StringBuilder 클래스를 사용해야 하는데 이것은 자바의 최적화에 있어서 비교적 중요한 원칙이다.예를 들어 String을 사용할 때 문자열을 결합할 때 "+"를 사용하여 JVM에 임시 StringBuffer 객체를 형성하고 각 문자열에 하나의 대상을 만듭니다. 두 문자열을 결합하면 모두 4개의 대상을 만듭니다.(결과를 저장하는 String, 두 문자열 객체, 임시 StringBuffer 객체)StringBuffer를 사용하면 2개의 객체만 만들 수 있습니다!StringBuffer 객체와 마지막 결과를 저장하는 String 객체
(3)?더 좋은 성능을 얻으려면 StirngBuffer 또는 StirngBuilder를 구성할 때 가능한 한 용량을 지정해야 합니다.물론 문자열의 길이가 16자를 넘지 않으면 사용하지 않습니다.용량을 지정하지 않으면 성능이 현저히 떨어진다.
(4) StringBuilder는 일반적으로 메소드 내부에서 "+"와 같은 기능을 수행합니다.라인이 안전하지 않기 때문에 다 쓴 후에 버릴 수 있다.StringBuffer는 주로 글로벌 변수에 사용됩니다.
(5) 같은 상황에서 StirngBuilder를 사용하는 것보다 StringBuffer를 사용하면 10%~15% 정도의 성능 향상을 얻을 수 있지만 다중 스레드가 안전하지 않을 위험을 무릅써야 한다.그러나 현실적인 모듈화 프로그래밍에서 어떤 모듈을 담당하는 프로그래머가 반드시 이 모듈이 다중 스레드 환경에 들어가서 실행될지 명확하게 판단할 수 있는 것은 아니다. 따라서 시스템의 병목이 StringBuffer에 있고 당신의 모듈이 다중 스레드 모드에서 실행되지 않는다는 것을 확인하지 않으면 StringBuilder를 사용할 수 있다.아니면 StringBuffer로

좋은 웹페이지 즐겨찾기