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과 동일합니다.
위의 코드를 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과 동일합니다.