java String의 intern 방법

2757 단어 javaintern
우선 우리가 알아야 할 것은 JDK1.6과 JDK1.7에서 String 클래스의 intern 방법은 여전히 차이가 있다는 것이다.
JDK1.6의 intern:
intern 방법을 호출할 때 먼저 상량 탱크에 가서 현재 String 값과 같은 값이 있는지 확인하고 존재하면 상량 탱크에 있는 이 String 값의 인용을 되돌려줍니다.존재하지 않으면 원래 쌓인 문자열을 상수 탱크로 복사합니다.  
JDK1.7의 intern:
intern 방법을 호출할 때 먼저 상량 탱크에 가서 현재 String 값과 같은 값이 있는지 확인하고 존재하면 상량 탱크에 있는 이 String 값의 인용을 되돌려줍니다.존재하지 않으면 원래 쌓인 문자열의 인용만 상수 탱크에 놓고 전체 문자열을 상수 탱크로 복사하지 않습니다.   
즉, 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); 
   
  String str2 = new String("str01");④ 
  str2.intern();⑤ 
  String str3 = "str01";⑥ 
  System.out.println(str2 == str3); 
   
  String str4 = "str01";⑦ 
  String str5 = new String("str")+new String("01");⑧ 
  str5.intern();⑨ 
  System.out.println(str4 == str5); 
JDK1.6에서 출력한 결과는 다음과 같습니다.
false
false
false
설명:
① 실행할 때 메모리에'str01'이라는 문자열 대상str를 만들고 상수 탱크에'str'와'01'상량을 만든다.
② 실행할 때 먼저 상수 탱크에 "str01"의 상수가 존재하는지 확인하고, 존재하지 않는 것을 발견한다. JDK1.6의 방법은 이 문자열'str01'을 상수 탱크에 생성하는 것이다.
③ 실행할 때 상수 탱크에 "str01"대상을 만들고 존재하기 때문에 새로 만들지 않습니다.
첫 번째 출력false의 원인은str는 메모리를 쌓는'str01'을 가리키고str1은 상량 탱크의'str01'을 가리킨다.
④ 실행할 때 메모리에'str01'이라는 문자열 대상str2를 만들고 상수 탱크에'str01'이라는 상수를 만듭니다.
⑤ 실행할 때 먼저 상량 탱크에 가서 "str01"의 상량이 존재하는지 확인하고 존재하는 것을 발견하면 이 상량 인용을 되돌려줍니다.
⑥ 실행할 때 상수 탱크에 "str01"값의 상수를 만들고 존재하는 것을 발견하면 만들지 않습니다.
두 번째 출력false의 원인은str2가 가리키는 것은 메모리를 쌓는'str01'이고str3가 가리키는 것은 상량 탱크의'str01'이다.
⑦ 실행할 때 상수 탱크에'str01'이라는 값을 생성합니다.
⑧ 실행할 때 메모리에'str01'이라는 문자열 대상str5를 만들고 상수 탱크에'str'와'01'상량을 생성합니다.
⑨ 실행할 때 상량 탱크에 가서'str01'의 상량이 존재하는지 확인하고 존재하는 것을 발견하면 이 상량 인용으로 되돌아간다.
세 번째 출력false의 원인은str5는 메모리를 쌓는'str01'을 가리키고str4는 상량 탱크의'str01'을 가리킨다.
JDK1.7에서 출력한 결과는 다음과 같습니다.
true
false
false
설명:
첫 번째 출력 결과만 다르다는 것을 발견했기 때문에 우리는 첫 번째 원인만 설명한다.
① 실행할 때 메모리에'str01'이라는 문자열 대상str를 만들고 상수 탱크에'str'와'01'상량을 만든다.(JDK1.6과 다를 바 없음)
② 실행할 때 먼저 상수 탱크에 "str01"의 상수가 존재하는지 확인하고 존재하지 않는 것을 발견한다. JDK1.7의 방법은 메모리에 있는 "str01"의 인용을 상수 탱크에 복사하는 것이다.
③ 실행할 때 상수 탱크에 "str01"대상을 만들고 존재하기 때문에 새로 만들지 않습니다.
그러면 이때str와str1은 메모리에 쌓인'str01'의 값을 가리키기 때문에 둘은 같다.
이상은 JDK1.6과 JDK1.7 중 String류의intern 방법에 대한 비교입니다. 차이가 있습니다. 필요하신 분들은 참고하시기 바랍니다.

좋은 웹페이지 즐겨찾기