1 문자열
문자열 : 문자열 상수, 문자열 길이는 불변입니다.
2 StringBuffer
StringBuffer : 문자열 변수 (동기화, 즉 스레드-안전). 문자열 컨텐츠를 자주 수정하려면 효율적인 이유로 StringBuffer를 사용하는 것이 가장 좋습니다. 문자열 유형으로 변환하려면 StringBuffer의 toString () 메소드를 호출 할 수 있습니다.
java.lang.stringbuffer 스레드-안전한 변이성 문자 시퀀스. 어느 시점에서나 특정 문자 순서가 포함되어 있지만 일부 메소드 호출에 의해 시퀀스의 길이와 내용을 변경할 수 있습니다. 문자열 버퍼는 여러 스레드에 안전하게 사용할 수 있습니다.
StringBuffer의 주요 작업은 Append and Insert 메소드이며 모든 유형의 데이터를 수락하도록 과부하 할 수 있습니다. 각 메소드는 지정된 데이터를 문자열로 효과적으로 변환 한 다음 문자열의 문자를 문자열 버퍼에 추가 또는 삽입 할 수 있습니다. Append 메소드는 항상 버퍼 끝에 이러한 문자를 추가합니다. 삽입 메소드는 지정된 지점에서 문자를 추가합니다. 예를 들어, z가 현재 내용이 "시작"인 문자열 버퍼 객체를 참조하면이 메소드는 z.append ( "le")에 문자열 버퍼에 "stractle"을 포함하고 z.insert (4, "le")에 "스타 렛"을 포함하도록 문자열 버퍼를 변경합니다.
3 StringBuilder
StringBuilder : String ariable (스레드 안전 금고).
java.lang.stringBuilder는 JDK5.0에 새로 추가되는 가변 문자 순서입니다. 이 클래스는 StringBuffer 호환 API를 제공하지만 동기화되지는 않습니다. 이 클래스는 문자열 버퍼가 단일 스레드에서 사용될 때 StringBuffer를 간단하게 대체하도록 설계되었습니다 (일반적). 가능하면 대부분의 구현에서는 StringBuffer보다 빠르기 때문에이 클래스를 먼저 차지하는 것이 좋습니다. 둘 다의 방법은 기본적으로 동일합니다.
대부분의 경우 StringBuilder> StringBuffer.
4 세 사이의 차이
문자열 유형과 StringBuffer : String의 주요 성능 차이는 불변의 객체입니다. 따라서 문자열 유형이 변경 될 때마다 새 문자열 객체가 생성되고 포인터가 새 문자열 객체를 가리 킵니다. 따라서 객체가 생성 될 때마다 시스템 성능에 영향을 미치기 때문에 특히 메모리에 참조 된 객체가 너무 많을 때 JVM의 GC가 작동하고 성능이 저하되기 때문에 컨텐츠를 변경하는 문자열에는 문자열을 사용하지 않는 것이 가장 좋습니다.
StringBuffer 클래스를 사용하는 경우 StringBuffer 객체 자체는 새 개체를 생성하고 객체 참조를 변경하는 대신 매번 작동합니다. 따라서 대부분의 경우 StringBuffer가 권장됩니다. 특히 문자열 객체가 종종 변경 될 때.
일부 특수한 경우, 문자열 객체의 문자열 스 플라이 싱은 실제로 JVM에 의해 StringBuffer 객체의 스 플라이 싱으로 해석되므로 문자열 객체의 속도는 이시기에 StringBuffer 객체보다 느리지 않습니다.
문자열 s1 = "이것은 단지" + "simple" + "test"입니다. StringBuffer sb = new StringBuilder ( "이것은 단지 A"). Append ( "Simple"). Append ( "Test");
문자열 S1 객체를 생성하는 것은 StringBuffer보다 느리지 않습니다. 실제로 JVM에서는 다음 변환이 자동으로 수행됩니다.
문자열 s1 = "이것은 단지" + "simple" + "test"입니다.
JVM은 위의 진술을 다음과 같이 직접 취급합니다.
문자열 s1 =“이것은 단순한 테스트 일뿐입니다”;
따라서 속도는 매우 빠릅니다. 그러나 스 플라이 싱 된 문자열이 다른 문자열 객체에서 나오면 JVM이 자동으로 변환되지 않으며 속도가 빠르지 않습니다.
문자열 s2 = "이것은 단지"; 문자열 s3 = "simple"; 문자열 s4 = "test"; 문자열 s1 = s2 + s3 + s4;
현재 JVM은 원래 방식으로 정기적으로 수행합니다.
대부분의 경우 StringBuffer> String.
4.StringBuffer 및 StringBuilder
둘 사이에는 거의 차이가 없습니다. 그들은 기본적으로 부모 클래스의 다양한 방법을 호출하고 있습니다. 중요한 차이점은 StringBuffer가 스레드 안전하다는 것입니다. 대부분의 내부 방법에는 키워드가 동기화되어 특정 성능 소비가 발생합니다. StringBuilder는 비틀 거리지 않으므로 더 효율적입니다.
public static void main (String [] args)은 예외 {문자열 string = "0"; int n = 10000; Long Begin = System.CurrentTimeMillis (); for (int i = 1; i <n; i ++) {string+= i; } long end = System.CurrentTimeMillis (); 긴 = 종료 사이 - 시작; System.out.println ( "문자열 클래스를 사용하여 소비 된 시간 :" + 간 + "ms"); int n1 = 10000; StringBuffer sb = new StringBuffer ( "0"); Long Start1 = System.CurrentTimeMillis (); for (int j = 1; j <n1; j ++) {sb.append (j); } long end1 = System.CurrentTimeMillis (); 긴 1 = end1- 시작 1; System.out.println ( "StringBuffer 클래스를 사용하여 소비 시간 :" + Ty1 + "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 (); 긴 사이) 2 = end2- 시작 2; System.out.println ( "StringBuilder 클래스를 사용하는 데 시간이 소요됩니다 :" + 사이 2 + "MS"); } 산출:
문자열 클래스 사용 시간 : 982ms StringBuffer 클래스 사용 시간 : 2ms StringBuilder 클래스 사용 시간 : 1ms
이 숫자는 매번 다르고 각 기계의 상황이 다르지만 확실한 몇 가지 점이 있으며 문자열 클래스는 다른 두 가지보다 훨씬 더 많이 소비됩니다. 또 다른 요점은 StringBuffer가 StringBuilder보다 더 많은 것을 소비한다는 것입니다.
5 사용 전략
(1) 기본 원칙 : 소량의 데이터를 작동하려면 문자열을 사용하십시오. 단일 스레드로 많은 양의 데이터를 작동하는 경우 StringBuilder를 사용하십시오. 멀티 스레드로 많은 양의 데이터를 작동하는 경우 StringBuffer를 사용하십시오.
(2) 성능이 매우 열악한 경우 StringBuffer 또는 StringBuilder 클래스를 사용해야하므로 Java 최적화에서 비교적 중요한 원칙입니다. 예를 들어, 문자열을 사용할 때, 문자열을 스 플라이 싱 할 때 "+"를 사용하여 JVM에서 임시 StringBuffer 객체를 형성하고 동시에 각 문자열에 객체가 생성됩니다. 두 줄을 접한 후 총 4 개의 물체를 만들어야합니다! (결과를 보유하는 문자열, 두 개의 문자열 객체 및 임시 StringBuffer 객체). StringBuffer를 사용하는 경우 2 개의 객체 만 만들면됩니다! 마지막 결과를 보유하는 StringBuffer 객체 및 문자열 객체.
(3) 더 나은 성능을 위해, stirngbuffer 또는 stirngbuilder를 구성 할 때는 용량을 최대한 지정해야합니다. 물론 작동하는 문자열의 길이가 16자를 초과하지 않으면 필요하지 않습니다. 용량을 지정하지 않으면 성능이 크게 줄어 듭니다.
(4) StringBuilder는 일반적으로 유사한 "+"함수를 완료하기 위해 방법 내에서 사용됩니다. 왜냐하면 ? 스레드 안전은 사용 후 폐기 할 수 있습니다. StringBuffer는 주로 글로벌 변수에 사용됩니다.
(5) 같은 상황에서 stripngbuilder를 사용하면 StringBuffer를 사용하는 것과 비교하여 약 10% ~ 15%의 성능 향상을 달성 할 수 있지만 멀티 스레딩 불안의 위험이 필요합니다. 실제 모듈 식 프로그래밍에서 특정 모듈을 담당하는 프로그래머는 모듈이 다중 스레드 환경에 넣을지 여부를 명확하게 판단하지 않을 수 있습니다. 따라서 StringBuilder는 시스템의 병목 현상이 StringBuffer에 있고 모듈이 다중 스레드 모드로 실행되지 않는다고 확신하지 않는 한 만 사용할 수 있습니다. 그렇지 않으면 StringBuffer가 여전히 사용됩니다.