우선, 우리는 JDK1.6 및 JDK1.7에서 문자열 클래스의 인턴 방법에 여전히 차이가 있음을 분명히해야합니다.
JDK1.6의 인턴 :
인턴 방법을 호출 할 때 먼저 상수 풀로 이동하여 현재 문자열 값이 존재하는 것과 동일한 값이 있는지 확인하십시오. 존재하는 경우 상수 풀의 문자열 값에 대한 참조를 직접 반환합니다. 존재하지 않으면 원래 힙의 문자열이 상수 풀에 복사됩니다.
JDK1.7의 인턴 :
인턴 방법을 호출 할 때 먼저 상수 풀로 이동하여 현재 문자열 값이 존재하는 것과 동일한 값이 있는지 확인하십시오. 존재하는 경우 상수 풀의 문자열 값에 대한 참조를 직접 반환합니다. 존재하지 않으면 상수 풀에 원래 힙에 대한 참조 만 배치하고 전체 문자열을 상수 풀에 복사하지 않습니다.
이는이 문자열이 상수 풀에 존재하지 않을 때 JDK1.6 및 JDK1.7이 다르게 처리 함을 의미합니다.
다음은 확인하고 설명하는 예입니다.
예:
public static void main (string [] args) {String str = "str"+new String ( "01"); ① str.intern (); ② String str1 = "str01"; ③ system.out.println (str == str1); 문자열 str2 = new String ( "str01"); ④ str2.intern (); ⑤ String str3 = "str01"; ⑥ system.out.println (str2 == str3); 문자열 str4 = "str01"; ⑦ string str5 = new String ( "str")+new String ( "01"); ⑧ str5.intern (); ⑨ system.out.println (str4 == str5); JDK1.6에서 출력 결과는 다음과 같습니다.
거짓
거짓
거짓
설명하다:
① 실행 중에는 힙 메모리에 "str01"값이있는 문자열 객체 str가 생성되고 상수 풀에서 "str"및 "01"상수가 생성됩니다.
constance를 실행할 때 먼저 상수 풀로 가서 "str01"의 일정한 값이 있는지 확인하고 그것이 존재하지 않는지 확인하십시오. JDK1.6의 방법은 상수 풀에서 문자열 "str01"의 사본을 생성하는 것입니다.
③ 실행 중에는 "str01"객체가 상수 풀에서 생성되며 이미 존재한다는 것이 발견되므로 새로 생성되지 않을 것입니다.
첫 번째 출력 거짓의 이유는 StRT가 힙 메모리에서 "str01"을 가리키고 STR1은 상수 풀에서 "str01"을 가리키기 때문입니다.
④ 실행시, "str01"값을 갖는 문자열 객체 str2가 힙 메모리에 생성되고 "str01"값이 상수가 상수 풀에서 생성 될 것입니다.
constrance를 실행할 때 먼저 상수 풀로 가서 "str01"의 일정한 값이 있는지 확인하십시오. 그것이 존재한다는 것이 발견되면, 그것은이 일정한 참조를 직접 반환합니다.
⑥ 실행 중에 상수 풀에서 "str01"의 일정한 값이 생성됩니다. 이미 존재한다는 것이 발견되면 생성되지 않습니다.
두 번째 출력의 이유는 STR2가 힙 메모리에서 "str01"을 가리키고, STR3은 상수 풀에서 "str01"을 가리키기 때문입니다.
⑦ 실행 중에는 상수 풀에서 "str01"의 일정한 값이 생성됩니다.
heeply를 실행할 때, "str01"값이있는 문자열 객체 str5가 힙 메모리에 생성되고, "str"및 "01"상수가 상수 풀에서 생성 될 것입니다.
constant Constant Pool은 "str01"의 일정한 값이 있는지 확인하는 데 사용됩니다. 그것이 발견되면,이 일정한 참조를 직접 반환합니다.
세 번째 출력의 이유는 STR5가 힙 메모리에서 "str01"을 가리키고, STR4는 상수 풀에서 "str01"을 가리키기 때문입니다.
JDK1.7에서 출력 결과는 다음과 같습니다.
진실
거짓
거짓
설명하다:
첫 번째 출력 결과 만 다르다는 것을 알았으므로 첫 번째 출력 결과 만 설명합니다.
① 실행 중에, "str01"값이있는 문자열 객체 str가 힙 메모리에 생성되고, "str"및 "01"상수가 상수 풀에서 생성됩니다. (이것은 JDK1.6과 다르지 않습니다)
constance를 실행할 때 먼저 상수 풀로 가서 "str01"의 일정한 값이 있는지 확인하고 그것이 존재하지 않는지 확인하십시오. JDK1.7의 방법은 힙 메모리에서 "str01"의 참조를 상수 풀에 복사하는 것입니다.
③ 실행 중에는 "str01"객체가 상수 풀에서 생성되며 이미 존재한다는 것이 발견되므로 새로 생성되지 않을 것입니다.
이시기에 STR 및 STR1은 힙 메모리에서 "str01"의 값을 가리 킵니다. 따라서 둘은 동일합니다.
위는 JDK1.6 및 JDK1.7의 문자열 클래스의 인턴 메소드를 비교 한 것입니다. 차이가 있습니다. 필요한 친구는 그것을 참조 할 수 있습니다.