"Java 가상 머신에 대한 심층적 인 이해"의 제 2 장 문제
이 책에서는 이러한 예제가있다 :
public class RuntimeConstantPoolOOM{
public static void main(String[] args){
String str1=new StringBuilder("计算机").append("软件").toString();
System.out.println(str1.intern()==str1);
String str2=new StringBuilder("ja").append("va").toString();
System.out.println(str2.intern()==str2);
}
}
저자 인해 시작 JDK1.7 점진적 "드 영구적 인 세대"를, 그래서 두 JDK1.6 false를 반환 할 경우, JDK1.7 실행이는 true의 거짓을 반환 않습니다.
인턴에서 JDK1.6 () 메소드는 우선 영구 세대에 복사 된 문자열의 인스턴스를 발생하는 것이기 때문에, 또한 문자열의 영구 세대 인스턴스의 반환 및 자바 힙에 생성 된 문자열 인스턴스 StringBulder를 인용 그것은 반드시 동일한 참조, 반환 거짓이 아니다.
리턴 문자열에 대한 참조 및 StringBuilder.toString (의해 생성 된 인스턴스)가 같은되고 그래서 JDK1.7에서 인턴 () 구현 예에서, 예를 복제되지 단지 처음 상수 풀 레코드 인용 .
() 발생 StringBuilder.toString을 실행하기 전에 "자바"문자열, 문자열 상수 풀의 참조를 가지고 있기 때문에 str2와 비교 반환 거짓은 "컴퓨터 소프트웨어" "첫 등장"의 원칙을 준수하지 않고 이 문자열 그러므로 true를 반환, 이번이 처음이다.
그런 의심은 "자바"문자열이 나타납니다 어디 전에,이? 분명히이 클래스 내부에 직접 나타나지 않습니다.
시스템, CTRL + 마우스 왼쪽 버튼의 경우, 클래스를 직접 호출되어, System 클래스에서 볼 수있는
버전이 initializeSystemClass 방법, 볼 수있는 클래스에
당신이보기 버전의 소스
가 자동으로되었습니다, 런타임 상수 풀을 볼 수 있습니다 그는 그래서 "자바"문자열 상수 풀이는 "자바"문자열에 합류했다.
오류에 관해서는, 덕분에 제기 된 많은 가축을 환영! ! !