>  기사  >  Java  >  Java의 String 클래스가 불변인 이유(자세한 설명)

Java의 String 클래스가 불변인 이유(자세한 설명)

烟雨青岚
烟雨青岚앞으로
2020-06-24 13:27:146605검색

Java의 String 클래스가 불변인 이유(자세한 설명)

Java의 String 클래스가 불변인 이유(자세한 설명)

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    /** The value is used for character storage. */
    private final char value[];}

String 클래스의 값은 값 배열에 저장되며 private final

1에 의해 수정됩니다. 클래스는 값에 액세스할 수 없으며, 하위 클래스는 해당 클래스에 액세스할 수 없습니다. 물론 String 클래스는 클래스가 최종 수정되므로 하위 클래스를 가질 수 없습니다. 2. 최종 수정은 값에 대한 참조가 변경되지 않음을 나타냅니다. String의 생성자는 값 배열의 값을 수정하는 다른 방법이 없으므로 값의 참조와 값이 변경되지 않도록 보장합니다.

그래서 String 클래스는 불변이라고 말합니다.

그리고 하위 문자열과 같은 많은 메소드는 원래 String 클래스에서 작동하지 않지만 새로운 String 클래스를 생성합니다

public String substring(int beginIndex) {
	if (beginIndex < 0) {
		throw new StringIndexOutOfBoundsException(beginIndex);
	}
	int subLen = value.length - beginIndex;
	if (subLen < 0) {
		throw new StringIndexOutOfBoundsException(subLen);
	}
	return (beginIndex == 0) ? this : new String(value, beginIndex, subLen);}

String이 불변으로 설정된 이유는 무엇입니까?

문자열 상수 풀

Java에는 8가지 기본 데이터 유형이 있습니다.

정수 유형: byte, short, int, long. 패키징 유형은 Byte, Short, Integer, Long
부동 소수점 유형: float, double입니다. 포장 유형은 Float, Double
문자 유형: char입니다. 포장 유형은 Character
Boolean 유형: boolean입니다. 패키징 유형은 Boolean

8가지 패키징 유형 중 Float 및 Double을 제외하고 나머지는 모두 플라이웨이트 모드를 통해 구현됩니다. 물론 String 클래스의 상수 풀은 JVM에서 구현됩니다. 수준.

상수 풀이 있는 이유는 무엇인가요?

Constant Pool은 시스템 성능에 영향을 미치는 객체의 빈번한 생성과 소멸을 방지하기 위한 것이며, 객체 공유를 구현합니다.

예를 들어 문자열 상수 풀은 컴파일 단계에서 모든 문자열 리터럴을 상수 풀에 넣습니다.

메모리 공간 절약: 상수 풀에 있는 동일한 문자열 상수가 모두 병합되어 한 공간만 차지합니다.
  • 실행 시간 절약: 문자열을 비교할 때 ==가 equals()보다 빠릅니다. 두 개의 참조 변수에 대해 ==를 사용하여 참조가 동일한지 여부를 확인하고 실제 값이 동일한지 확인할 수도 있습니다.
  • 문자열 상수 풀은 어디에 있나요?

jdk1.7 이전에는 아무 것도 논의하지 않겠습니다. jdk1.7부터 문자열 상수 풀이 힙에 배치되기 시작했으며 이후 이 기사의 모든 내용은 jdk1.8을 기반으로 합니다.

다음은 다음과 같습니다. 코드는 여전히 자주 묻는 질문입니다. 메모리의

String str1 = "abc";
String str2 = "abc";
String str3 = new String("abc");
String str4 = new String("abc");
// trueSystem.out.println(str1 == str2);
// falseSystem.out.println(str1 == str3);
// falseSystem.out.println(str3 == str4);

구조는 다음과 같습니다


상수 풀은 참조를 저장합니다Java의 String 클래스가 불변인 이유(자세한 설명)
위 코드의 출력을 설명합니다. Java

String str1 = "abc";
String str2 = "abc";
// trueSystem.out.println(str1 == str2);
에서 문자열 객체를 생성하는 방법은 2가지가 있습니다.

리터럴 값 사용 문자열을 생성할 때 JVM은 먼저 문자열 풀로 이동하여 "abc" 개체가 존재하는지 확인합니다. 존재하지 않으면 문자열 풀에 "abc" 개체를 만든 다음 추가합니다. 이 개체의 주소는 str1에 할당되므로 str1은 풀에 있는 문자열 개체 "abc"를 가리키게 되며 개체의 주소는 "abc"가 됩니다. 풀의 abc"가 직접 반환되어 str2에 할당됩니다. str1과 str2는 동일한 문자열 풀의 "abc" 개체를 가리키므로 결과는 true입니다.

String str3 = new String("abc");
String str4 = new String("abc");
// falseSystem.out.println(str3 == str4);

new 키워드를 사용하여 새 문자열 객체를 생성할 때 JVM은 먼저 문자열 풀에서 문자열 객체 "abc"를 검색합니다.

그렇지 않은 경우 먼저 문자열 풀에 "abc" 문자를 생성합니다. 그런 다음 힙에 "abc" 문자열 개체를 만든 다음 힙에 있는 "abc" 문자열 개체의 주소를 str3

에 할당합니다. 있는 경우 Now 없이 풀에 "abc" 개체를 만듭니다. , 힙에 직접 "abc" 문자열 개체를 만든 다음 힙에 있는 "abc" 개체의 주소를 str4에 할당합니다. 이러한 방식으로 str4는 힙에 생성된 "abc" 문자열 개체를 가리킵니다.

str3과 str4는 서로 다른 문자열 개체를 가리키므로 결과는 false입니다.

해시코드 캐싱

String 클래스가 생성되면 해시코드는 해시 멤버 변수에 캐시됩니다. String 클래스는 변경할 수 없기 때문에 해시코드는 변경되지 않습니다. 이런 식으로 해시코드를 사용하고 싶을 때마다 다시 계산하지 않고 바로 얻을 수 있어 효율성이 향상됩니다. String 클래스는 종종 HashMap 키로 사용됩니다. String 클래스가 가변이고 내용이 변경되면 hashCode도 변경됩니다. 이 키를 기반으로 HashMap에서 가져올 때 값을 얻지 못하거나 잘못된 경우가 있습니다. 값을 얻을 수 있습니다

스레드 안전성

불변 개체는 본질적으로 스레드로부터 안전하므로 다중 스레드 환경에서 문자열에 대한 동기화 작업을 피할 수 있습니다.

읽어주신 모든 분들께 감사드리며, 많은 도움이 되셨으면 좋겠습니다.

이 기사는 다음에서 복제되었습니다: https://blog.csdn.net/zzti_erlie/article/details/106872673

추천 튜토리얼: "java tutorial"

위 내용은 Java의 String 클래스가 불변인 이유(자세한 설명)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 csdn.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제