StringBuilder와 StringBuffer는 문자열 조작에 일반적으로 사용되는 두 가지 클래스입니다. 우리 모두가 알고 있듯이 StringBuilder는 스레드 인스 보안체이고 StringBuffer는 스레드 안전입니다. 전자는 JDK1.5에 의해 추가되었고, 후자는 JDK1.0에서 제공되었다. 아래의 내부 구현을 분석하겠습니다.
1. 상속 관계
공개 최종 클래스 StringBuffereExtends AbstractStringBuilderimplements java.io.serializable, charseverencepublic final class StringBuilderextends AbstractStringBuilderImplements java.io.serializable, char equessence
두 클래스 사이의 상속 관계는 정확히 동일하다는 것을 알 수 있습니다. 직렬화 가능한 것은 직렬화 가능한 플래그입니다. charEdecence 인터페이스에는 charat (), length (), sectected () 및 toString () 메소드가 포함됩니다. 문자열 클래스는 또한이 인터페이스를 구현합니다. 여기서 초점은 Abstract Class AbstractStringBuilder에 있으며 StringBuilder 및 StringBuffer의 대부분의 작업을 구현합니다.
2. AbstractStringBuilder
1. 변수 및 건축 방법
char [] value; int count; AbstractStringBuilder () {} AbstractStringBuilder (int capacity) {value = new Char [용량];}AbstractStringBuilder는 문자열을 저장하기 위해 char [] 배열을 사용하며, 초기 용량 방법은 시공 중에 지정할 수 있습니다.
2. 용량 확장
public void ensurecApacity (int minimumCapicacity) {if (MinimumCapacity> 0) ensureCapacitySternal (MinimumCapacity);} private void ensurecapacity internal (int minumcapacity) {// 오버 플로우 - 컨센스 코드 if (minumcapacity.length) (minimumCapacity); 최소 Capacity) {int newCapacity = value.length * 2 + 2; if (newCapacity -MinimumCapacity <0) newCapacity = MinimumCapacity; if (newCapacity <0) {if (minimumCapacity <0) // 오버플로가 새로운 outofMemoryError (); newCapacity = integer.max_value; } value = arrays.copyof (value, newCapacity);}확장 방법은 궁극적으로 expandCapacity ()에 의해 구현됩니다. 이 방법에서는 용량이 원래 용량 Plus 2로 먼저 확장됩니다. 현재 지정된 용량보다 더 적은 경우 새 용량이 최소 용량으로 설정됩니다. 그런 다음 넘어 지는지 확인하십시오. 넘쳐나면 정수로 용량을 설정하십시오 .max_value. 마지막으로, 값 값을 복사하는 것은 분명히 시간이 많이 걸리는 작업입니다.
3. 부록 () 메소드
public acpractStringBuilder Append (String str) {if (str == null) return accendnull (); int len = str.length (); ensurecapacity internal (count + len); str.getchars (0, len, 값, 카운트); count += len; 이것을 반환하십시오; }부록 ()는 가장 일반적으로 사용되는 방법이며 많은 형태의 과부하가 있습니다. 위의 것은 그중 하나이며 현을 추가하는 데 사용됩니다. STR이 NULL 인 경우 AppendNull () 메소드가 호출됩니다. 이 방법은 실제로 'n', 'u', 'l'및 'l'와 같은 문자를 추가합니다. NULL이 아닌 경우 먼저 용량을 확장 한 다음 String의 getChars () 메서드를 호출하여 값의 끝에 str을 추가하십시오. 마지막으로 객체 자체가 반환되므로 append ()를 지속적으로 호출 할 수 있습니다.
3. StringBuilder
AbstractStringBuilder는 대부분의 필요한 방법을 구현했으며 StringBuilder 및 StringBuffer는 호출되면됩니다. StringBuilder의 구현을 살펴 보겠습니다.
1. 생성자
public StringBuilder () {super (16);} public stringbuilder (int fapacit) {super (용량);} public StringBuilder (String Str) {super (str.length () + 16); Append (str);} public StringBuilder (charSequence seq) {this (seq.length () + 16); 부록 (seq);}알 수 있듯이 StringBuilder의 기본 용량 크기는 16입니다. 물론 초기 용량을 지정하거나 초기 값을 기존 문자 순서에서 StringBuilder 객체에 할당 할 수도 있습니다.
2. 부록 () 메소드
Public StringBuilder Append (String Str) {Super.Append (str); 이것을 반환;} public stringbuilder append (charSequence s) {super.append (s); 이것을 반환하십시오;}Append ()에는 많은 과부하 방법이 있으며 여기에는 두 가지가 있습니다. 분명히, 여기에는 부모 클래스의 AbstractStringBuilder의 방법이 직접 호출됩니다.
3. Tostring ()
public String toString () {// 사본 생성, 배열을 공유하지 마십시오. return new String (value, 0, count);}ToString () 메소드는 원래 객체와 메모리를 공유하지 않는 새 문자열 객체를 반환합니다. 실제로 AbstractStringBuilder의 substring () 메소드에 대해서도 마찬가지입니다.
4. Sringbuffer
StiringBuffer는 StringBuilder와 유사하지만 동기화를 달성하기 위해 많은 방법이 다음 방법과 같은 lsynchronized 수정을 사용합니다.
public synchronized int longth () {return count;} public synchronized stringbuffer append (string str) {tostringcache = null; Super.Append (str); 이것을 반환;} public synchronized void setlength (int newlength) {tostringcache = null; super.setlength (Newlength);} 보시다시피, 동기화 된 것은 실제로 메소드 앞에 추가됩니다.
또한 위의 부록 () 및 setLength () 메소드에는 가변 tostringCache도 있습니다. 이 변수는 ToString () 메소드의 마지막 캐시에 사용됩니다. StringBuffer가 수정 될 때 마다이 변수는 NULL에 할당됩니다. StringBuffer의 ToString은 다음과 같습니다.
public synchronized string toString () {if (tostringCache == null) {toStringCache = arrays.copyofRange (value, 0, count); } 새 문자열을 반환합니다 (TOSTRINGCACHE, TRUE);}이 방법에서는 TostringCache가 NULL 인 경우 먼저 캐시됩니다. 최종 반환 된 문자열 객체는 약간 다르며이 생성자는 매개 변수가 true입니다. 문자열의 소스 코드를 찾아보십시오.
문자열 (char [] value, boolean share) {// assert share : "샤워되지 않은 지원되지 않음"; this.value = value;}이 구성 방법에 의해 구성된 문자열 객체는 실제로 문자열을 복사하는 것이 아니라 시간 복사 요소를 절약하는 것입니다. 그러나이 생성자는 패키지 액세스 권한이 있으며 일반적으로 호출 할 수 없습니다.
요약
위는이 기사에 관한 것입니다. Java, StringBuilder 및 StringBuffer에서 일반적으로 사용되는 두 개의 작동 문자열 클래스를 배우는 것이 도움이되기를 바랍니다.