java - String的intern方法的疑问
天蓬老师
天蓬老师 2017-04-18 10:06:31
0
1
845
天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

모든 응답(1)
巴扎黑

위의 코드를 JDK6과 JDK7을 각각 사용해 실행해본 결과는 다음과 같습니다.

으아아아

질문자님 말씀대로 사실도 거짓도 아닌 이유는 크게 두 가지인 것 같습니다.

  • 문자열 "java"는 특별하며 상수 풀에 고정되어 있습니다.

따라서 코드

으아아아

str1.intern()은 상수 풀의 객체를 반환하므로 힙의 str1과 동일한 객체가 아닙니다.

  • "python" 문자열은 이미 코드에 나타나 있으므로 상수 풀에 추가됩니다.

코드의 두 번째 부분에서는 리터럴 상수 "python"이 나타나므로 상수 풀에 추가됩니다.
그리고:

으아아아

빈 문자열 ""이 문자열 "python"에 추가되므로 새 문자열 상수를 추가하지 않는 것과 동일하며 str2.intern()은 여전히 ​​상수 풀에 개체를 반환합니다.


사실 위의 질문은 다음과 같이 확장될 수 있습니다.

으아아아

방금 코드 "StringBuilder("ja").append("va")"의 첫 번째 부분을 "StringBuilder("ja").append("va1")"로 변경했습니다. ? 결과는?
JDK6 및 JDK7에서 실행한 결과를 살펴보겠습니다.

으아아아

JDK6과 JDK7의 실행 결과가 다른 이유는 무엇입니까?
사실 여기에는 다양한 JDK에서 intern() 메서드를 다르게 구현하는 작업이 포함됩니다.
JDK6 및 이전 JDK에서:

으아아아

JDK7 이상:

으아아아

JDK6과 JDK7의 intern() 메소드 간의 차이점을 바탕으로 다음 예를 알 수 있습니다.

으아아아

JDK마다 다른 결과가 반환되는 이유:
JDK6에서는 "java1"이 가장 먼저 나타나는 문자열 상수이므로 상수 풀에 복사되고 intern() 메서드는 객체를 반환합니다. 따라서 상수 풀의 문자열은 힙의 str1과 다릅니다.
JDK7에서 "java1"은 처음으로 나타나는 문자열 상수이지만 intern() 메서드는 이 개체만 참조합니다. 새 객체를 JDK6과 같은 상수 풀에 추가하므로 intern() 메서드에서 반환된 참조는 실제로 원래 str1과 동일합니다.

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