>  Q&A  >  본문

java - String的intern方法的疑问

天蓬老师天蓬老师2728일 전776

모든 응답(1)나는 대답할 것이다

  • 巴扎黑

    巴扎黑2017-04-18 10:08:31

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

    회신하다
    0
  • 취소회신하다