>Java >java지도 시간 >상수 풀에 동일한 리터럴에 대한 참조가 존재하는 경우에도 Java가 새 문자열 개체를 생성하는 이유는 무엇입니까?

상수 풀에 동일한 리터럴에 대한 참조가 존재하는 경우에도 Java가 새 문자열 개체를 생성하는 이유는 무엇입니까?

DDD
DDD원래의
2024-11-03 07:26:02582검색

Why Does Java Create a New String Object Even When a Reference to the Same Literal Exists in the Constant Pool?

Java 문자열 상수 풀: 내부 및 참조 평등

소개:

문자열 상수 풀은 Java의 기능입니다. 문자열 리터럴을 포함하여 상수 값을 저장하는 JVM(Java Virtual Machine)입니다. JVM은 컴파일 중에 문자열 리터럴을 발견하면 풀에서 동일한 값을 가진 기존 리터럴을 확인합니다. 발견되면 새 리터럴에 대한 참조가 기존 문자열로 전달되어 새 인스턴스 생성을 방지합니다.

"new" 키워드로 인터닝:

그러나 , 새 String 객체를 생성할 때 "new" 키워드를 사용하면 제공된 참조에 설명된 대로 다른 동작이 발생합니다. 문자열 리터럴(이 경우 "test")에 대한 참조는 여전히 풀에 배치되지만 JVM은 풀의 문자열 개체를 재사용하는 대신 런타임에 새 문자열 개체를 생성해야 합니다.

질문:

풀의 문자열 리터럴에 대한 참조가 "new"로 생성되었을 때와 동일하면 JVM은 새 참조를 생성하는 대신 기존 참조를 반환합니까?

답변:

아니요, JVM은 "new" 연산자를 사용할 때 기존 참조를 반환하지 않습니다. . 대신, 새로운 String 객체를 생성하고 이를 "new" 키워드로 생성된 참조에 할당합니다. 그 이유는 다음과 같습니다.

  • 리터럴 인턴: 컴파일러가 문자열 리터럴 "test"를 발견하면 풀에서 기존의 동일한 문자열을 확인합니다. 값이 "test"인 새 문자열 개체가 생성되어 풀에 배치됩니다.
  • "new"를 사용한 개체 구성: 새 문자열을 만들 때 "new String(literal)"을 사용하여 객체를 생성하면 리터럴("test")에 대한 참조가 생성자에 전달됩니다. 이는 생성자의 참조가 풀의 리터럴과 동일한 값을 갖는다는 것을 의미합니다.
  • 새 객체 생성: 그러나 "new" 연산자는 JVM에 새 문자열을 생성하도록 지시합니다. 물체. 이 새 개체는 동일한 리터럴 값을 참조하더라도 풀에 저장된 개체와는 별개의 인스턴스입니다.

예:

<code class="java">String literal = "test";
String one = new String(literal);
String two = "test";

System.out.println(literal == two); // true (references in pool)
System.out.println(one == two); // false (distinct objects)</code>

이 예에서 "리터럴" 및 "2" 참조는 풀의 동일한 String 개체를 가리킵니다. 그러나 "one" 참조는 "new"에 의해 생성된 다른 String 객체를 가리킵니다. 따라서 "=="를 사용한 동등 비교는 false를 반환합니다.

설명:

"컴파일러가 문자열 리터럴을 발견하면 풀에서 문자열 리터럴을 확인합니다. 동일한 문자열이 이미 존재하는 경우"는 "풀에 있음"으로 해석되어야 합니다. 즉, 인턴되었거나 풀에 명시적으로 추가된 문자열 리터럴만 고려된다는 의미입니다. 인턴

위 내용은 상수 풀에 동일한 리터럴에 대한 참조가 존재하는 경우에도 Java가 새 문자열 개체를 생성하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.