"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > 문자열 상수 풀: 리터럴이 존재하는 경우에도 \"new\"가 새 문자열 개체를 생성하는 이유는 무엇입니까?

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

2024-11-06에 게시됨
검색:489

String Constant Pool: Why Does \

문자열 상수 풀: 심층 조사

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

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

  • "컴파일러가 문자열 리터럴을 발견하면 풀에서 동일한 문자열이 이미 존재하는지 확인합니다."
  • "In 'new'의 경우 문자열 리터럴에 대한 참조는 여전히 상수 테이블에 저장되지만 'new'를 사용하면 JVM은 상수 테이블에서 하나."

이러한 문은 문자열 리터럴이 풀에 억류되어 저장되는 동안 "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"에 대한 새 String 개체가 강제로 생성되기 때문입니다.

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

최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3