>  Q&A  >  본문

Java 문자열의 저장 위치에 대한 의심

다음과 같은 질문이 있습니다.

new String("aaa")으로 생성된 객체는 몇 개입니까? 그 이유는 aaa 변수가 상수 영역에 있으면 힙에 하나만 생성되고, 상수 영역에 aaa 변수가 없으면 상수 영역에 하나가 생성되기 때문입니다. 그리고 하나는 힙에 있습니다.

하지만 실제 테스트 결과는 일관성이 없습니다.

으아악

new String("aaa")이 힙과 상수 영역 모두에 객체를 생성한다면 왜 s2는 s1의 상수 풀에 대한 참조를 직접 재사용하지 않습니까?

보충:
제가 잘못 생각한 것을 발견했습니다. s1은 힙에 있는 요소를 가리켜야 하고, s2는 상수 풀에 있는 요소를 가리켜야 하는데, 둘이 같지 않은 것이 맞습니다. new String("aaa ")도 동시에 상수 풀에 객체를 생성합니까?

또는 String s3 = "aa".concat("a"); 이 s3가 힙이나 상수 풀을 가리키나요?

仅有的幸福仅有的幸福2713일 전673

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

  • 过去多啦不再A梦

    过去多啦不再A梦2017-05-17 10:02:54

    으아아아

    String 인스턴스가 intern() 메서드를 호출하면 상수 풀에 동일한 문자열 상수가 있는지 확인합니다. 그렇다면 해당 참조를 반환합니다. 상수 풀에 str과 동일한 값을 추가합니다. s2가 이미 상수 풀에 있으므로 s1.intern()은 이를 다시 생성하지 않고 동일한 "aaa"를 직접 참조합니다.

    이것이 충분하지 않다면 실험해 봅시다.

    으아아아

    그럼 명령줄

    상수 풀에는 VV

    가 있습니다.

    회신하다
    0
  • PHPz

    PHPz2017-05-17 10:02:54

    질문 1:

    String a = "aaa"는 상수 풀에 객체를 생성합니다. 동일한 객체가 상수 풀에 있으면 a는 객체를 직접 가리킵니다. 그리고 String a = new String("aaa"), 상수 풀에 존재하는 경우 상수 풀에는 생성되지 않고 힙에만 생성됩니다.

    으아아아

    질문 2:

    소스 코드에서 답을 찾으세요. String s3 = "aa".concat("a"); 실제로는 힙에 객체를 생성하는 String s3 = new String("aaa")와 동일합니다.

    으아아아

    회신하다
    0
  • 伊谢尔伦

    伊谢尔伦2017-05-17 10:02:54

    String은 값이 할당될 때마다 새로운 String 객체 인스턴스를 생성하지 않나요? 이것이 바로 StringBuilder가 있는 이유입니다.

    회신하다
    0
  • ringa_lee

    ringa_lee2017-05-17 10:02:54

    객체 지향적 사고에 따르면 String 자체가 상수 풀에 객체를 동시에 생성할지 여부를 가장 잘 알 수 있습니다. 음, intern() 메서드가 있습니다.

    회신하다
    0
  • 漂亮男人

    漂亮男人2017-05-17 10:02:54

    이전 답변은 이미 매우 좋습니다. "문자열을 상수 풀에 넣는다"는 말은 문자열 참조를 문자열 상수 풀(본질적으로 In에 있는 문자열 풀)에 넣는 것을 의미합니다. 해시 테이블) 문자열 자체는 여전히 힙에 배치됩니다.

    회신하다
    0
  • 过去多啦不再A梦

    过去多啦不再A梦2017-05-17 10:02:54

    으아아아

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