문자열, 문자열 상수 수영장과 문자열 인턴 방법에 대해 알아야 할

RohitT :
  1. 내가 말한다면 거기에 문자열 상수 풀에 어떤 문자열이없고, 경우, 말

    String s = "Java";
    

    그리고 얼마나 많은 객체를 생성 할 것인가?

  2. 이제 풀에 다시 아무것도, 나는 말을하지

    String s = new String("Java");
    

    자, 얼마나 많은 객체를 생성 할 것인가?

  3. 이제 풀에 다시 아무것도, 나는 말을하지

    String s = new String("Java");
    s.intern();
    

    인턴 방법은 무엇을 할 것인가?

  4. 이제 풀에 다시 아무것도, 나는 말을하지

    String s = new String("Java");
    String s1 = s.intern();
    

    지금은 어떻게됩니까?

난 정말 그것에 대해 혼란 스러워요로 답변 해주세요.

내가 SCJP5 캐시 시에라 책을 읽으면서 새로운 문자열을 만들 때, 다음이 객체는 힙에 하나 풀 하나 생성됩니다.

스티븐 C :

각 시간을로드하고 새로운 JVM에, 정확히 한 번만 코드를 실행 이하 나는 각각의 예제에서 가정합니다. (나는 또한 코드에서 그 조직을 가정 할 것이다 당신이 문자를 사용 할 "Java"그 일을 복잡하게 것이기 때문에 ....)


1) 말 내가 말한다면 거기에 문자열 상수 풀에 어떤 문자열이없고, 경우,

String s = "Java";

그리고 얼마나 많은 객체를 생성 할 것인가?

하나 개의 문자열이 생성 및 방법이로드 될 때 풀에 추가됩니다.


2) 풀 이제 다시 아무것도, 나는 말

String s = new String("Java");

지금 얼마나 많은 개체를하는 것은 생성됩니다.

하나 개의 문자열이 생성 및 방법이로드 될 때 풀에 추가됩니다.

두 번째 문자열은에 의해 만들어진 new코드가 실행될 때, 그것은 풀에 추가되지 않습니다.


3) 풀 이제 다시 아무것도, 나는 말

String s = new String("Java");
s.intern();

인턴 방법은 무엇을 할 것인가?

하나 개의 문자열이 생성 및 방법이로드 될 때 풀에 추가됩니다.

두 번째 문자열은에 의해 만들어진 new, 그것은 풀에 추가되지 않습니다.

intern호출은 첫 번째 문자열을 반환합니다. (당신은 참조를 유지하지 않습니다 ...)


4) 풀 이제 다시 아무것도, 나는 말

String s = new String("Java");
String s1 = s.intern();

지금은 어떻게됩니까?

이와 같은 실시 예 3과 같이, s1받는 기준 개최 String나타내는 오브젝트 "Java"문자열 리터럴.


난 당신이 가진 문자열을 만들 때, SCJP5 캐시 시에라 책에서 읽은 new다음,이 객체가 힙에 하나 풀 하나 만들어집니다.

나는 책이 정확히 그런 말을 의심. (당신은 부연 설명, 그리고 난 당신이 부정확 다소 의역 한 생각합니다.)

리터럴을 나타내는 문자열 객체를 생성하고 코드 조각이로드 될 때 풀에 추가됩니다 (AN이 중요하다!)하지만 그러나 귀하의 의역은 대략 올 1 이 실행하지 않을 때.


그리고 혼란의 다른 점을 해결하기 :

"내가 실제로 의미 당신이 준 대답에서,이 문자열은 항상 문자열 상수 풀에 추가 될 것으로 보인다이었다."

즉 올바르지 않습니다. 그것은 잘못된 일반화이다.

그것은 위의 모든 경우 4 사실이지만, 그것은 다른 사람을 위해 진실하지 않습니다. 그것은 원래 문자열이 어디에서 왔는지에 따라 달라집니다. 일반적인 애플리케이션에서 대부분의 텍스트 데이터는 파일, 소켓, 또는 사용자 인터페이스에서 읽습니다. 그렇게되면, 문자열은 문자의 배열, 직접 또는 라이브러리 호출을 통해로부터 만들어집니다.

다음은 간단한 (하지만 비현실적인) 쇼의 구성 요소 문자에서 문자열을 만드는 것이 예입니다.

String s = new String(new char[]{'J', 'a', 'v', 'a'});

(가) 위의 코드에서, 단 하나의 문자열이 생성, 그리고 문자열 풀에 아닙니다. 당신이 결과 문자열을 원한다면 당신이해야 할 문자열 풀에 있어야합니다 명시 적으로 호출 intern같은 것을 :

String s = new String(new char[]{'J', 'a', 'v', 'a'});
s = s.intern();

(필요한 경우)를 생성 할 문자열 풀 스트링 2 .


1 - 분명히, 일부의 JVM 생성 및 인턴 문자열 리터럴에서 이루어집니다 느리게 실제로 발생했을 때 100 % 확실하게 말할 수 없습니다, 그래서. 그러나, 한 번만 발생합니다 (클래스 당이 참조 리터럴), 코드 조각은 JVM에 의해 실행되는 횟수에 상관없이.

2 - 방법이 없습니다 new문자열 풀에 캐릭터. 그것은 실제로 JLS의 위반이 될 것입니다. new작업은 같은 JLS로 지정된 항상 새로운 객체를 생성.

추천

출처http://43.154.161.224:23101/article/api/json?id=185749&siteId=1