문자열 상수 풀: 심층 조사
Java의 문자열 리터럴은 메모리 사용을 최적화하고 성능을 향상시키기 위해 풀링됩니다. 즉, 문자열 리터럴이 발견되면 컴파일러는 문자열 상수 풀에서 동일한 값을 가진 기존 문자열 개체를 확인합니다. 발견되면 참조는 기존 객체로 전달되어 새 객체 생성을 방지합니다.
그러나 "new" 연산자를 사용하여 새 String 객체를 생성하면 규칙에 어긋나는 것처럼 보이기 때문에 혼란이 발생합니다. 인턴의. 이를 명확히 하기 위해 다음 문을 검토해 보겠습니다.
이러한 문은 문자열 리터럴이 풀에 억류되어 저장되는 동안 "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