String.intern ()와 새의 StringBuilder ( ""). 추가] ( "")에 대해. ToString ()는 "자바") (실행 StringBuilder.toString 전에 표시

"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 방법, 볼 수있는 클래스에
그림 삽입 설명 여기당신이보기 버전의 소스
그림 삽입 설명 여기가 자동으로되었습니다, 런타임 상수 풀을 볼 수 있습니다 그는 그래서 "자바"문자열 상수 풀이는 "자바"문자열에 합류했다.

오류에 관해서는, 덕분에 제기 된 많은 가축을 환영! ! !

게시 24 개 원래 기사 · 원의 칭찬 0 · 조회수 611

추천

출처blog.csdn.net/weixin_43896829/article/details/103840822