머리말
이 기사는 주로 JDK 소스 코드 분석, StringBuilder 및 StringBuffer에 대한 관련 컨텐츠를 소개합니다. 참조와 학습을 위해 공유됩니다. 나는 아래에서 많이 말하지 않을 것입니다. 자세한 소개를 함께 살펴 보겠습니다.
문자열 클래스의 진술
Public Final Class String은 Java.io.serializable, 비슷한 <string>, char서 {…}를 구현합니다.문자열 클래스는 최종 수정자를 사용하여 상속받을 수 없음을 나타냅니다. 동시에, 세 개의 인터페이스를 구현하여 직렬화 가능한 인터페이스를 구현하여 문자열 클래스가 직렬화 될 수 있음을 나타냅니다. 비슷한 <t> 인터페이스 구현은 주로 문자열 문자열을 비교하기위한 비교 방법을 제공합니다. 또한 char는 읽기 가능한 시퀀스의 가치가 있음을 나타내는 charEdegence 인터페이스를 구현합니다 (Charbuffer, 세그먼트, 문자열, StringBuffer 및 StringBuilder는 또한 Charecedence 인터페이스를 구현합니다).
문자열 기본 필드 및 속성 설명
/*문자열 배열 값, 문자열에 실제 문자를 저장*/private final char value [];/*문자열 기본값의 해시 값 0*/private int hash; /*문자열 기본값의 해시 값 0*//*문자열 객체를 정렬하는 데 사용되는 비교기, 비교에 ignorecase 메소드는*/public static final comparator <string> case_insensitive_order = new CaseInsenSitiveComparator ()를 사용합니다.
문자열 부분 메소드 분석
문자열 클래스는 일련의 생성자를 제공하며 아래 그림과 같이 몇몇 생성자를 더 이상 권장하지 않습니다.
건설자
일반적으로 사용되는 두 가지 생성자의 구현은 다음과 같습니다.
// String str = new String ( "123") public String (String Original) {this.value = original.value; this.hash = original.hash;} // String str3 = new String (new char [] { '1', '2', '3'}); public string (char value []) {// 문자 배열 값을 값으로 값으로 복사 this.value = arrays.copyof (value, value.length); }부울 평등 (개체 anobject)
문자열 클래스는이 문자열을 지정된 객체와 비교하기 위해 Equals 메소드를 대체합니다. 매개 변수가 null이 아닌 경우에만 결과는 사실입니다.
public boolean equals (객체 anobject) {// 객체 참조를 직접 비교하고 (this == anobject) {return true; } // 현재 객체의 문자 시퀀스를 anobject 값과 비교합니다. int n = value.length; if (n == anotherstring.value.length) {char v1 [] = value; char v2 [] = anotherstring.value; int i = 0; while (n-! = 0) {if (v1 [i]! = v2 [i]) false를 반환합니다. i ++; } true를 반환합니다. }} 거짓을 반환합니다. }int compareto (문자열 anotherstring)
두 줄의 문자 시퀀스를 비트 단위로 비교하십시오. 비트 문자가 동일하지 않으면 해당 비트의 두 문자의 유니 코드 값의 차이를 반환하십시오. 모든 비트는 동일하며 두 줄의 길이의 차이를 계산하십시오. 두 줄이 동일하면 0을 반환하십시오.
public int compareto (String anotherstring) {int len1 = value.length; int len2 = anotherstring.value.length; // 길이가 작은 문자열 길이 int lim = math.min (len1, len2); char v1 [] = 값; char v2 [] = anotherstring.value; int k = 0; while (k <lim) {// 두 문자열의 문자 순서 값을 하나씩 비교합니다. 그것이 동일하지 않은 경우, 해당 위치에서 두 문자의 유니 코드 간의 차이를 반환하십시오. char c1 = v1 [k]; char c2 = v2 [k]; if (c1! = c2) {return c1 -c2; // 유니 코드의 차이를 반환} k ++; } // 작은 문자열의 모든 비트가 비교되고 두 문자열의 길이 사이의 차이가 반환됩니다. // 두 문자열이 동일하면 길이의 차이는 0입니다. } ComparetOignorecase (String Str) 방법은 유사하게 구현됩니다. 문자의 상부 및 하부 사례는 비교 중에 무시되며 구현 방법은 다음과 같습니다.
public int compar (문자열 s1, 문자열 s2) {int n1 = s1.length (); int n2 = s2.length (); int min = math.min (n1, n2); for (int i = 0; i <min; i ++) {char c1 = s1.charat (i); char c2 = s2.charat (i); if (c1! = c2) {c1 = 문자 .toupperCase (c1); C2 = 문자 .ToupperCase (C2); if (c1! = c2) {c1 = 문자 .tolowercase (c1); C2 = 문자 .tolowercase (C2); if (c1! = c2) {// 숫자 프로모션으로 인해 오버플로가 없음 C1 -C2; }}}} return n1 -n2; }기본 문자열 인턴 ()
인턴 메소드가 호출되면, 풀에 이미이 문자열 객체와 동일한 문자열이 포함 된 경우 (Equals (Object) 메소드로 결정된 경우 풀의 문자열이 반환됩니다. 그렇지 않으면이 문자열 객체를 풀에 추가 하고이 문자열 객체에 대한 참조를 반환하십시오.
모든 문자 문자열 및 문자열 할당 상수 표현식은 인턴 메소드를 사용하여 작동합니다.
문자열 메모리 위치 : 상수 수영장 또는 힙
문자열 객체는 리터럴 또는 생성자를 통해 직접 생성 할 수 있습니다. 차이점은 무엇입니까?
1. "+"스 플라이 싱을 통해 문자 그대로 또는 문자 그대로 생성 된 문자열 객체는 상수 풀에 저장됩니다. 실제 창조 중에 상수 풀이 존재하면 참조가 직접 반환됩니다. 존재하지 않으면 문자열 객체가 생성됩니다.
2. 생성자를 사용하여 문자열 객체를 만들고 힙에 직접 문자열 객체를 만듭니다.
3. 인턴 방법을 호출하고 객체를 상수 수영장에 넣습니다 (존재하지 않으면 상수 풀에 배치되며 존재하면 참조로 반환됩니다).
다음은 문자열 객체의 메모리 할당의 예입니다.
문자열 str1 = 새 문자열 ( "123"); 문자열 str2 = "123"; 문자열 str3 = "123"; 문자열 str4 = str1.intern (); System.out.println (str1 == str2); // false str1은 힙에 객체를 생성하고, str2는 상수 풀 시스템에서 객체를 만듭니다. out.println (str2 == str3); // true str2는 상수 풀에서 객체를 생성하고 str3은 str2에 의해 생성 된 객체에 대한 참조를 직접 반환하므로 str2와 str3은 상수 풀 시스템의 동일한 객체를 가리 킵니다. // true str4는 상수 풀에서 "123"값의 객체를 반환하므로 str4, str2 및 str3은 동일합니다.
문자열 스티칭 예제 :
public class stringtest {public static final String x = "ABC"; // constant x @test public void test () {String str5 = new String ( "abc"); 문자열 str6 = str5+"def"; // String str7 = "abc"+"def"를 작성합니다. // 상수 풀 문자열 str8 = x+"def"; // x는 일정하고 값이 고정되어 있으므로 x+"def"의 값이 ABCDEF로 설정되었습니다. 실제로, 컴파일 후, 코드는 String str8 = "abcdef"String str9 = "abc"와 동일합니다. 문자열 str10 = str9+"def"; //system.out.println(str6==Str7); // false system.out.println (str8 == str7); // true system.out.println (str10 == str7); // false system.out.println (x == str9); //진실} }소환 된 코드는 한눈에 분명합니다.
메모리 할당은 다음과 같습니다.
문자열, StringBuffer, StringBuilder
문자열 유형별로 내부적으로 유지되는 문자열 저장을위한 속성 값 [] 문자 배열은 최종으로 수정되므로 :
/** 값은 문자 저장에 사용됩니다. */Private Final Char Value [];
과제 후 수정할 수 있음을 나타냅니다. 그러므로 우리는 문자열 객체가 한 번 만들어 졌다고 생각합니다. 개발 중에 자주 접합 문자열 작업을 수행하는 경우 String에서 제공 한 연락처를 사용하거나 "+"스 플라이 싱 스트링을 직접 사용하면 새로운 문자열이 자주 생성되며 비효율적입니다. Java는 두 가지 다른 클래스를 제공합니다 : Stringbuffer와 StringBuilder는이 문제를 해결하는 데 사용됩니다.
다음 코드를 살펴보십시오.
문자열 str1 = "123"; 문자열 str2 = "456"; 문자열 str3 = "789"; 문자열 str4 = "123" + "456" + "789"; // 상수를 추가하면 컴파일러는 String str4 = "123456789"String str5 = str1 + str2 + str3을 자동으로 인식합니다. // Sticket String 변수, StringBuilder StringBuilder sb = new StringBuilder ()를 사용하는 것이 좋습니다. sb.append (str1); sb.append (str2); sb.append (str3);
다음은 StringBuilder 클래스의 구현으로 분석 된 일부 코드 만 차단합니다.
공개 최종 클래스 StringBuilder는 AbstractStringBuilder를 확장합니다. 이것을 반환하십시오; }}
Abstract AbstractStringBuilder는 문자열 클래스* / char [] value와는 다른 문자열을 저장하는 문자열 배열을 구현할 수 있습니다. /*** 카운트는 사용 된 문자 수입니다. */ int count; public acpractStringBuilder Append (String str) {if (str == null) return accendnull (); int len = str.length (); // 용량이 EnseRecapacitysInternal (Count + Len)으로 확장되어야하는지 확인합니다. // 문자열 str을 값으로 복사 str.getchars (0, len, value, count); count += len; retract this;} 개인 void ensurecapacity internal (int minimumCapacity) {// 오버 플로우 의식 의식 code // minimumCapacity = count+str.length // 값이 값 용량보다 큰 경우 값 용량보다 큰 경우 (최소 Capacity -Length> 0) {// expand value value를 복사하고, 새로운 특성 값을 복사합니다. Arrays.copyof (값, NewCapacity (최소 Capacity)); }} // StringBuilder 확장 Private int newCapacity (int mincapacity) {// 오버 플로우에 민감한 코드 // 확장 용량 계산 // 기본 확장 배열 길이는 원래 숫자 (값 []) 그룹 길이의 2 배 씩 확장되고 2는 규칙에 추가됩니다. 왜 2를 추가합니까? int newCapacity = (value.length << 1) + 2; if (newCapacity -MinCapacity <0) {newCapacity = mincapacity; } return (newCapacity <= 0 || max_array_size -newCapacity <0)? hugecapacity (mincapacity) : NewCapacity; }}StringBuffer 및 StringBuilder도 마찬가지입니다. 내부적으로 유지되는 값 [] 문자 배열은 변이 가능합니다. 유일한 차이점은 StringBuffer가 스레드-안전하다는 것입니다. 모든 방법을 동기화합니다. StringBuilder는 스레드가 안전하지 않습니다. 따라서, 다중 스레드 작업 및 공유 문자열 변수 인 경우 String 스 플라이 싱 처리에 StringBuffer가 선호됩니다. 그렇지 않으면 StringBuilder를 사용할 수 있습니다. 결국, 스레드 동기화는 또한 특정 소비를 가져옵니다.
요약
위는이 기사의 전체 내용입니다. 이 기사의 내용에 모든 사람의 연구 나 작업에 대한 특정 참조 가치가 있기를 바랍니다. 궁금한 점이 있으면 의사 소통을 위해 메시지를 남길 수 있습니다. Wulin.com을 지원 해주셔서 감사합니다.