Java String的intern方法
大家讲道理
大家讲道理 2017-04-17 17:49:54
0
2
416
String str1 = new StringBuilder("a").append("b").toString();
        System.out.println(str1.intern() == str1);
        String str2 = new StringBuilder("c").toString();
        System.out.println(str2.intern() == str2);

为什么输出结果是:
true
false

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

모든 응답(2)
小葫芦

으아악

Java 메모리 모델에는 문자열 상수를 저장하는 문자열 상수 풀이라는 영역이 있습니다.

우선 jdk 버전이 1.6 이하인 경우 위 코드를 실행한 결과는

으아악

jdk 버전이 1.6 이상인 경우 위 코드의 실행 결과는

으아악

위의 두 가지 결과가 다른 이유는 jvm이 intern() 메서드를 다르게 구현하기 때문입니다.

jdk1.6 이하에서는 intern()을 호출합니다

상수 풀에 동일한 값을 갖는 문자열이 없으면 jvm은 문자열을 생성 풀에 복사하고 상수 풀에 문자열을 반환합니다.

jdk1.7 이상에서는 intern()을 호출하세요

상수 풀에 동일한 값을 갖는 문자열이 없으면 jvm은 현재 문자열의 참조를 상수 풀에 기록하고 현재 문자열의 참조를 반환합니다.

다음으로 위 코드가 jdk1.7 이상에서 truefalse을 얻는 이유를 설명하겠습니다.

위 코드가 포함된 클래스가 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입니다. 왜냐하면 str1append 작업 후 상수 풀의 상수에 대한 참조가 되기 때문입니다.
System.out.println(str2.intern() == str2);은 str2가 변수에 대한 참조이고 상수 풀에 없기 때문에 false으로 출력됩니다.
따라서 str.intern() == strfalse인지 true인지 판단해야 하는데, 주로 상수 풀에서 str가 상수인지 여부에 따라 결과는 true이고, 그렇지 않으면 결과는 false입니다. 바로

입니다.
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿