위의 두 가지 결과가 다른 이유는 jvm이 intern() 메서드를 다르게 구현하기 때문입니다.
jdk1.6 이하에서는 intern()을 호출합니다
상수 풀에 동일한 값을 갖는 문자열이 없으면 jvm은 문자열을 생성 풀에 복사하고 상수 풀에 문자열을 반환합니다.
jdk1.7 이상에서는 intern()을 호출하세요
상수 풀에 동일한 값을 갖는 문자열이 없으면 jvm은 현재 문자열의 참조를 상수 풀에 기록하고 현재 문자열의 참조를 반환합니다.
다음으로 위 코드가 jdk1.7 이상에서 true 및 false을 얻는 이유를 설명하겠습니다.
위 코드가 포함된 클래스가 JVM에 의해 로드되면 리터럴 상수 a, b, c가 문자열 상수 풀에 로드됩니다. is not 문자열 str1.intern()이 없으면 jvm은 상수 풀에 ab의 참조를 기록하고 str1의 참조를 반환합니다. 따라서 코드의 두 번째 줄의 출력은 str1입니다. true
은 리터럴 상수 str2를 사용하여 새 문자열을 생성합니다. 이 문자열의 참조는 상수 풀의 리터럴 c 문자열 참조와 다릅니다. pool c이 이미 JVM에 존재하는 경우 JVM은 재구성된 str2.intern()과 다른 상수 풀의 참조를 직접 반환하므로 4행의 출력은 c입니다. str2
intern() 메소드를 호출하는 String 객체는 먼저 상수 풀에서 객체의 equals 상수를 찾아 반환합니다. 찾을 수 없는 경우 객체의 equals 상수를 상수 풀에 추가합니다. 그리고 그것을 반환합니다. 상수를 적용합니다. System.out.println(str1.intern() == str1);의 출력은 true입니다. 왜냐하면 str1는 append 작업 후 상수 풀의 상수에 대한 참조가 되기 때문입니다. System.out.println(str2.intern() == str2);은 str2가 변수에 대한 참조이고 상수 풀에 없기 때문에 false으로 출력됩니다. 따라서 str.intern() == str이 false인지 true인지 판단해야 하는데, 주로 상수 풀에서 str가 상수인지 여부에 따라 결과는 true이고, 그렇지 않으면 결과는 false입니다. 바로
으아악
Java 메모리 모델에는 문자열 상수를 저장하는 문자열 상수 풀이라는 영역이 있습니다.
우선 jdk 버전이 1.6 이하인 경우 위 코드를 실행한 결과는
으아악jdk 버전이 1.6 이상인 경우 위 코드의 실행 결과는
으아악위의 두 가지 결과가 다른 이유는 jvm이 intern() 메서드를 다르게 구현하기 때문입니다.
jdk1.6 이하에서는 intern()을 호출합니다
jdk1.7 이상에서는 intern()을 호출하세요
다음으로 위 코드가 jdk1.7 이상에서
true
및false
을 얻는 이유를 설명하겠습니다.위 코드가 포함된 클래스가 JVM에 의해 로드되면 리터럴 상수
a
,b
,c
가 문자열 상수 풀에 로드됩니다. is not 문자열str1.intern()
이 없으면 jvm은 상수 풀에ab
의 참조를 기록하고str1
의 참조를 반환합니다. 따라서 코드의 두 번째 줄의 출력은str1
입니다.true
은 리터럴 상수
str2
를 사용하여 새 문자열을 생성합니다. 이 문자열의 참조는 상수 풀의 리터럴c
문자열 참조와 다릅니다. poolc
이 이미 JVM에 존재하는 경우 JVM은 재구성된str2.intern()
과 다른 상수 풀의 참조를 직접 반환하므로 4행의 출력은c
입니다.str2
입니다.intern()
메소드를 호출하는 String 객체는 먼저 상수 풀에서 객체의equals
상수를 찾아 반환합니다. 찾을 수 없는 경우 객체의equals
상수를 상수 풀에 추가합니다. 그리고 그것을 반환합니다. 상수를 적용합니다.System.out.println(str1.intern() == str1);
의 출력은true
입니다. 왜냐하면str1
는append
작업 후 상수 풀의 상수에 대한 참조가 되기 때문입니다.System.out.println(str2.intern() == str2);
은 str2가 변수에 대한 참조이고 상수 풀에 없기 때문에false
으로 출력됩니다.따라서
str.intern() == str
이false
인지true
인지 판단해야 하는데, 주로 상수 풀에서str
가 상수인지 여부에 따라 결과는true
이고, 그렇지 않으면 결과는false
입니다. 바로