Java의 String StringBuilder 및 StringBuffer 상세 설명 및 사용 사례

Android/Java 개발에서 문자열을 처리하는 데 자주 사용되는 클래스는 세 가지가 있는데 그것이 바로 String, StringBuilder, StringBuffer이다.
그것들의 공통점:
1) 모두final류로 상속을 허락하지 않는다.
2) String 길이는 변경할 수 없고 String Buffer, String Builder 길이는 변경할 수 없습니다.
3) StringBuffer는 스레드가 안전하고 StringBuilder는 스레드가 안전하지 않습니다.
String VS StringBuffer
String 유형과 String Buffer의 주요 성능 차이점: String은 변경할 수 없는 대상입니다. 따라서 String 유형을 변경할 때마다 새로운 String 대상을 생성하고 바늘을 새로운 String 대상으로 가리키기 때문에 내용을 자주 바꾸는 문자열은 String을 사용하지 마십시오. 대상을 생성할 때마다 시스템 성능에 영향을 미치기 때문입니다. 특히 메모리에 인용되지 않은 대상이 많으면JVM의 GC가 작동하기 시작하면 성능이 저하됩니다.
StringBuffer 클래스를 사용할 때, 매번 StringBuffer 대상 자체를 조작합니다. 새로운 대상을 생성하고 인용을 바꾸는 것이 아니라.따라서 대부분의 경우 StringBuffer, 특히 문자열 대상이 자주 바뀌는 경우를 추천합니다.
특정 상황에서 String 객체의 문자열 결합은 Java Compiler에서 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보다 느리지 않습니다.사실 Java Compiler에서는 다음과 같은 변환이 자동으로 수행됩니다.
Java Compiler는 위의 첫 번째 문장을 다음과 같이 직접 컴파일합니다.

String s2 = “This is only a”; 
String s3 = “ simple”; 
String s4 = “ test”; 
String s1 = s2 + s3 + s4;
이때 Java Compiler는 규칙적으로 원래의 방식에 따라 한다. String의 concatenation(즉 +) 조작은 StringBuilder(또는 StringBuffer)의 append 방법을 이용하여 이루어진다. 이때 상기 상황에 대해 s2, s3, s4는 String 정의를 사용하고 연결할 때 StringBuffer(또는 StringBuilder)를 추가로 만들어서 StringBuffer를 String으로 전환해야 한다.StringBuffer(또는 StringBuilder)를 사용하면 StringBuffer를 추가로 만들 필요가 없습니다.
StringBuilder
StringBuilder는 5.0에 새로 추가되었습니다.이 유형은 동기화를 보장하지 않으면서 StringBuffer와 호환되는 API를 제공합니다.이 클래스는 문자열 버퍼가 한 라인에서 사용될 때 사용되는 StringBuffer의 간단한 교체로 설계되었습니다.가능하다면, 이 종류를 우선적으로 사용하는 것을 권장합니다. 왜냐하면 대부분의 실현에서 StringBuffer보다 빠르기 때문입니다.양자의 방법은 기본적으로 같다.
정책 사용
1) 기본 원칙: 소량의 데이터를 조작하려면 String을 사용한다.단일 스레드로 대량의 데이터를 조작하고 StringBuilder를 사용합니다.다중 스레드는 StringBuffer를 사용하여 대량의 데이터를 조작합니다.
2) String 클래스의'+'를 사용하여 빈번한 조립을 하지 마라. 왜냐하면 그런 성능이 매우 나쁘기 때문에 String Buffer나 String Builder 클래스를 사용해야 한다. 이것은 자바의 최적화에 있어서 비교적 중요한 원칙이다.예:

String result = ""; 
for (String s : hugeArray) { 
 result = result + s; 
} 

//  StringBuilder 
StringBuilder sb = new StringBuilder(); 
for (String s : hugeArray) { 
 sb.append(s); 
} 
String result = sb.toString();

위의 상황이 나타날 때, 분명히 우리는 두 번째 방법을 사용해야 한다. 왜냐하면 첫 번째 방법은 매번 순환할 때마다 결과를 저장하는 데 Stringresult를 만들기 때문이다. 그 외에 둘은 기본적으로 같다.
3) StringBuilder는 일반적으로 메소드 내부에서 "+"기능을 수행하는데 스레드가 안전하지 않기 때문에 사용한 후에 버릴 수 있습니다.StringBuffer는 주로 글로벌 변수에 사용됩니다.
4) 같은 상황에서 StirngBuilder를 사용하는 것보다 StringBuffer를 사용하면 10%~15% 정도의 성능 향상을 얻을 수 있지만 다중 스레드가 안전하지 않을 위험을 무릅써야 한다.그러나 현실적인 모듈화 프로그래밍에서 어떤 모듈을 담당하는 프로그래머가 반드시 이 모듈이 다중 스레드 환경에 들어가서 실행될지 명확하게 판단할 수 있는 것은 아니다. 따라서 시스템의 병목이 StringBuffer에 있고 당신의 모듈이 다중 스레드 모드에서 실행되지 않는다는 것을 확인하지 않으면 StringBuilder를 사용할 수 있다.아니면 StringBuffer로
읽어주셔서 감사합니다. 여러분에게 도움이 되었으면 좋겠습니다. 본 사이트에 대한 지지에 감사드립니다!

좋은 웹페이지 즐겨찾기