>Java >java지도 시간 >동일한 값을 가진 문자열이 문자열 상수 풀에 이미 존재하는데도 \'new String()\'이 새 객체를 생성하는 이유는 무엇입니까?

동일한 값을 가진 문자열이 문자열 상수 풀에 이미 존재하는데도 \'new String()\'이 새 객체를 생성하는 이유는 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-11-03 05:58:30373검색

Why does

문자열 상수 풀: 인터닝 및 "new" 연산자 이해

Java에서는 "abc"와 같은 문자열 리터럴이 인터닝됩니다. , 이는 문자열 상수 풀에 저장되고 이에 대한 참조가 공유된다는 의미입니다. 그러나 "new" 연산자를 사용하여 새 String 개체를 생성하면 풀에 있는 기존 개체를 참조하지 않고 메모리에 새 개체가 생성됩니다.

이 동작과 관련하여 상충되는 설명으로 인해 오해가 발생했습니다. JVM은 리터럴을 발견할 때 풀의 기존 문자열을 확인하는 반면, 이 확인은 실제로 인턴된 문자열에만 적용됩니다. 풀이 아닌 메모리에서 리터럴을 참조하는 경우("new" 사용), 일치하는 문자열이 풀에 이미 존재하더라도 새 개체가 생성됩니다.

이를 설명하려면 다음 코드를 고려하세요.

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

"test"는 인턴된 리터럴이므로 이에 대한 참조가 이미 풀에 있습니다. 그러나 "new"를 사용하여 하나를 생성하면 새 String 객체가 메모리에 할당됩니다. 즉, 두 객체와 다른 참조를 갖게 됩니다.

<code class="java">System.out.println(one.equals(two)); // true
System.out.println(one == two);      // false</code>

equals() 메서드는 문자열 값을 비교합니다. 동일하지만 == 연산자는 서로 다른 참조를 비교합니다.

"new"를 사용하여 생성된 문자열이 여전히 풀에 배치되어 있음을 암시하는 문으로 인해 혼란이 발생할 수 있지만 이는 오해의 소지가 있습니다. 리터럴과 동일한 값을 가진 문자열이 메모리 어딘가에 존재할 수 있지만 풀에 추가되지 않으며 리터럴 자체를 통해 액세스할 수 없습니다.

따라서 "new" 연산자를 사용할 때 JVM은 동일한 값을 가진 개체가 존재하더라도 풀에서 기존 개체에 대한 참조를 반환하는 대신 메모리에 새 String 개체를 생성합니다.

위 내용은 동일한 값을 가진 문자열이 문자열 상수 풀에 이미 존재하는데도 \'new String()\'이 새 객체를 생성하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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