>Java >java지도 시간 >문자열 상수 풀: 리터럴이 존재하는 경우에도 \'new\'가 새 문자열 개체를 생성하는 이유는 무엇입니까?

문자열 상수 풀: 리터럴이 존재하는 경우에도 \'new\'가 새 문자열 개체를 생성하는 이유는 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-11-03 08:05:30865검색

String Constant Pool: Why Does

문자열 상수 풀: 심층 조사

Java의 문자열 리터럴은 메모리 사용을 최적화하고 성능을 향상시키기 위해 풀링됩니다. 즉, 문자열 리터럴이 발견되면 컴파일러는 문자열 상수 풀에서 동일한 값을 가진 기존 문자열 개체를 확인합니다. 발견되면 참조는 기존 객체로 전달되어 새 객체가 생성되지 않습니다.

그러나 "new" 연산자를 사용하여 새 String 객체를 생성하면 규칙에 어긋나는 것처럼 보이기 때문에 혼란이 발생합니다. 인턴의. 이를 명확히 하기 위해 다음 명령문을 검토해 보겠습니다.

  • "컴파일러가 문자열 리터럴을 발견하면 풀에서 동일한 문자열이 이미 존재하는지 확인합니다."
  • "In 'new'의 경우 문자열 리터럴에 대한 참조는 여전히 상수 테이블에 배치되지만 'new'를 사용하면 JVM은 상수의 객체를 사용하는 대신 런타임에 새 String 객체를 생성해야 합니다. table."

이러한 문은 문자열 리터럴이 풀에 인턴되어 저장되는 동안 "new"를 사용하면 JVM이 새 문자열 개체를 생성하게 됨을 나타냅니다. 즉, 풀에 동등한 문자열이 존재함에도 불구하고 "new" 연산자는 이를 우회하고 풀이 아닌 메모리에 새 객체를 할당합니다.

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

String one = new String("test");
String two = "test";
System.out.println(one.equals(two)); // true
System.out.println(one == two); // false

예상대로 "one"과 "two"의 값은 모두 "test"이지만 "==" 비교는 서로 다른 String 객체를 참조하기 때문에 false를 반환합니다. 이는 문자열 리터럴 "test"가 풀에 이미 존재하더라도 "new"를 사용하면 "one"에 대한 새 문자열 개체가 강제로 생성되기 때문입니다.

요약하면 문자열 상수 풀은 문자열 리터럴을 인터닝하여 메모리 사용량을 계산합니다. 그러나 "new"를 사용하면 풀을 우회하고 풀이 아닌 메모리에 새 String 개체를 만듭니다. 결과적으로 값은 동일하지만 참조가 다른 두 개의 서로 다른 String 객체가 생성됩니다.

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

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