문자열 상수 풀: 인터닝 및 "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 중국어 웹사이트의 기타 관련 기사를 참조하세요!