Java String의 일부 소스 코드 해석을 공유합니다.
Java 문자열 부분 소스 코드 해석에 대한 기사를 살펴보고 편집기로 살펴보겠습니다.
문자열 유형의 멤버 변수
/** String的属性值 */ private final char value[]; /** The offset is the first index of the storage that is used. */ /**数组被使用的开始位置**/ private final int offset; /** The count is the number of characters in the String. */ /**String中元素的个数**/ private final int count; /** Cache the hash code for the string */ /**String类型的hash值**/ private int hash; // Default to 0 /** use serialVersionUID from JDK 1.0.2 for interoperability */ private static final long serialVersionUID = -6849794470754667710L;
위의 멤버 변수를 통해 String 클래스의 값은 최종적이며 변경할 수 없음을 알 수 있으므로 값이 변경되는 한 새로운 String 유형의 객체가 생성되고 String 데이터는 변경되지 않습니다. 반드시 배열 요소의 0번째 위치부터 시작할 필요는 없지만 오프셋이 가리키는 요소부터 시작합니다.
다음 코드는 새 개체를 생성하고 최종 결과는 새 값 "bbaa"를 포함하는 새 문자열 값입니다.
String a = new String("bb"); String b = new String("aa"); String c = a + b;
문자열 유형 객체의 길이는 불변이라고 할 수도 있습니다. 문자열 접합 문자열은 매번 새로운 객체를 생성하므로 문자열 접합 효율성은 확실히 가변 길이 StringBuffer 및 StringBuilder만큼 빠르지는 않습니다. .
그러나 다음 상황에서는 두 문자열이 빠르게 연결됩니다.
String a = "aa" + "bb";
이유는 다음과 같습니다. Java는 문자열 연결을 위해 약간의 최적화를 수행했습니다. "aa"와 "bb". "aabb"에 직접 연결되고 값이 a에 할당됩니다. String 객체는 한 번만 생성하면 되며, 이는 위 방법에 비해 String 생성 시간을 두 배로 절약하고 분명히 훨씬 더 효율적입니다.
일반적인구성 방법을 살펴보겠습니다. 1. 매개변수 없는 구성 방법:
public String() { this.offset = 0; this.count = 0; this.value = new char[0]; }
2. 문자열 유형 객체
public String(String original) { int size = original.count; char[] originalValue = original.value; char[] v; if (originalValue.length > size) { // The array representing the String is bigger than the new // String itself. Perhaps this constructor is being called // in order to trim the baggage, so make a copy of the array. int off = original.offset; v = Arrays.copyOfRange(originalValue, off, off+size); } else { // The array representing the String is the same // size as the String, so no point in making a copy. v = originalValue; } this.offset = 0; this.count = size; this.value = v; }
의 생성자를 전달합니다. 3. 문자 배열
public String(char value[]) { int size = value.length; this.offset = 0; this.count = size; this.value = Arrays.copyOf(value, size); }
의 생성자를 전달합니다. 4. 문자열 번호와 시작 요소인 생성자를 전달합니다. 요소 수
public String(char value[], int offset, int count) { if (offset < 0) { throw new StringIndexOutOfBoundsException(offset); } if (count < 0) { throw new StringIndexOutOfBoundsException(count); } // Note: offset or count might be near -1>>>1. if (offset > value.length - count) { throw new StringIndexOutOfBoundsException(offset + count); } this.offset = 0; this.count = count; this.value = Arrays.copyOfRange(value, offset, offset+count); }
위의 공통 생성자에서 String 객체를 생성할 때 객체의 세 가지 속성인 offset, count 및 value에 값을 할당해야 함을 알 수 있습니다. 그러면 완성된 String 유형을 얻을 수 있습니다.
공용 함수:
1. 두 문자열이 같은지 확인하는 함수(Equal): 실제로는 비교 인스턴스가 문자열 유형인지 먼저 확인하는 것입니다. data, not 그런 다음 False를 반환합니다. 그렇다면 각 문자 요소를 비교하여 동일한지 확인합니다. 동일하면 True를 반환하고, 그렇지 않으면 False를 반환합니다.
public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String)anObject; int n = count; if (n == anotherString.count) { char v1[] = value; char v2[] = anotherString.value; int i = offset; int j = anotherString.offset; while (n-- != 0) { if (v1[i++] != v2[j++]) return false; } return true; } } return false; }
2. 크기를 비교하는 함수 of two strings(compareTo ): 입력은 두 개의 문자열입니다. 반환된 0은 두 문자열의 값이 동일하다는 의미입니다. 반환이 0보다 작으면 첫 번째 문자열의 값이 값보다 작습니다. 두 번째 문자열의 값입니다. 0보다 크면 첫 번째 문자열의 값이 두 번째 문자열의 값보다 크다는 의미입니다.
비교 과정은 주로 다음과 같습니다. 두 문자열의 첫 번째 요소부터 시작하여 실제 비교는 두 문자의 ACII 코드입니다. 다른 값이 추가되면 첫 번째 다른 값이 됩니다. 차이가 있으면 0을 반환합니다.
public int compareTo(String anotherString) { int len1 = count; int len2 = anotherString.count; int n = Math.min(len1, len2); char v1[] = value; char v2[] = anotherString.value; int i = offset; int j = anotherString.offset; if (i == j) { int k = i; int lim = n + i; while (k < lim) { char c1 = v1[k]; char c2 = v2[k]; if (c1 != c2) { return c1 - c2; } k++; } } else { while (n-- != 0) { char c1 = v1[i++]; char c2 = v2[j++]; if (c1 != c2) { return c1 - c2; } } } return len1 - len2; }
코드 보기
3. 문자열이 접두사 문자열로 시작하는지 확인합니다. toffset은 길이가 같습니다
public boolean startsWith(String prefix, int toffset) { char ta[] = value; int to = offset + toffset; char pa[] = prefix.value; int po = prefix.offset; int pc = prefix.count; // Note: toffset might be near -1>>>1. if ((toffset < 0) || (toffset > count - pc)) { return false; } while (--pc >= 0) { if (ta[to++] != pa[po++]) { return false; } } return true; } public int hashCode() { int h = hash; if (h == 0) { int off = offset; char val[] = value; int len = count; for (int i = 0; i < len; i++) { h = 31*h + val[off++]; } hash = h; } return h; }
4. 두 문자열 연결(concat)
public String concat(String str) { int otherLen = str.length(); if (otherLen == 0) { return this; } char buf[] = new char[count + otherLen]; getChars(0, count, buf, 0); str.getChars(0, otherLen, buf, count); return new String(0, count + otherLen, buf); }
문자열을 연결하는 여러 가지 방법
1. 가장 직접적인 방법은 +를 사용하여 직접 연결하는 것입니다.
String a = new String("bb"); String b = new String("aa"); String c = a + b;
2. concat(String) 메서드
String a = new String("bb"); String b = new String("aa"); String d = a.concat(b);
3. StringBuilder 사용
String a = new String("bb"); String b = new String("aa"); StringBuffer buffer = new StringBuffer().append(a).append(b);
첫 번째와 두 번째 방법이 더 자주 사용되지만 효율성은 상대적으로 낮습니다.
【관련 추천】
1. 자바에서는 문자열이 객체인가요, 클래스인가요? Java의 String에 대한 자세한 설명
2. Java의 String 클래스 예제 튜토리얼 요약
3. Java의 문자열 클래스? Java의 String 클래스의 일반적인 메소드 요약
4.위 내용은 Java String의 일부 소스 코드 해석을 공유합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











Java의 난수 생성기 안내. 여기서는 예제를 통해 Java의 함수와 예제를 통해 두 가지 다른 생성기에 대해 설명합니다.

Java의 Weka 가이드. 여기에서는 소개, weka java 사용 방법, 플랫폼 유형 및 장점을 예제와 함께 설명합니다.

Java의 Smith Number 가이드. 여기서는 정의, Java에서 스미스 번호를 확인하는 방법에 대해 논의합니다. 코드 구현의 예.

이 기사에서는 가장 많이 묻는 Java Spring 면접 질문과 자세한 답변을 보관했습니다. 그래야 면접에 합격할 수 있습니다.

Java 8은 스트림 API를 소개하여 데이터 컬렉션을 처리하는 강력하고 표현적인 방법을 제공합니다. 그러나 스트림을 사용할 때 일반적인 질문은 다음과 같은 것입니다. 기존 루프는 조기 중단 또는 반환을 허용하지만 스트림의 Foreach 메소드는이 방법을 직접 지원하지 않습니다. 이 기사는 이유를 설명하고 스트림 처리 시스템에서 조기 종료를 구현하기위한 대체 방법을 탐색합니다. 추가 읽기 : Java Stream API 개선 스트림 foreach를 이해하십시오 Foreach 메소드는 스트림의 각 요소에서 하나의 작업을 수행하는 터미널 작동입니다. 디자인 의도입니다

Java의 TimeStamp to Date 안내. 여기서는 소개와 예제와 함께 Java에서 타임스탬프를 날짜로 변환하는 방법에 대해서도 설명합니다.

캡슐은 3 차원 기하학적 그림이며, 양쪽 끝에 실린더와 반구로 구성됩니다. 캡슐의 부피는 실린더의 부피와 양쪽 끝에 반구의 부피를 첨가하여 계산할 수 있습니다. 이 튜토리얼은 다른 방법을 사용하여 Java에서 주어진 캡슐의 부피를 계산하는 방법에 대해 논의합니다. 캡슐 볼륨 공식 캡슐 볼륨에 대한 공식은 다음과 같습니다. 캡슐 부피 = 원통형 볼륨 2 반구 볼륨 안에, R : 반구의 반경. H : 실린더의 높이 (반구 제외). 예 1 입력하다 반경 = 5 단위 높이 = 10 단위 산출 볼륨 = 1570.8 입방 단위 설명하다 공식을 사용하여 볼륨 계산 : 부피 = π × r2 × h (4
