2010-02-01 3 views

답변

6
String s = "Test"; 

먼저 문자열 상수 풀에서 문자열 "테스트"를 찾습니다. 발견되면 (자), 발견 된 객체를 참조하도록 (듯이)됩니다. 발견되지 않는 경우, 새로운 String 객체가 생성되어 풀에 추가되고 s가 새로 생성 된 객체를 참조하도록 만들어집니다.

String s = new String("Test"); 

먼저 새 문자열 개체를 만들고이를 참조하도록 지정합니다. 또한 "Test"문자열에 대한 항목이 인 경우이없는 경우 문자열 상수 풀에 입력됩니다.

문자열 "Test"가 풀에 없다고 가정하면 첫 번째 선언은 하나의 객체를 만들고 두 번째 선언은 두 개의 객체를 만듭니다.

+1

내가 알기로는 상수의 조회/개체 생성 풀은 특정 코드 행이 실행될 때가 아니라 클래스가로드 될 때 클래스의 코드에서 발생하는 모든 리터럴에 대해 발생합니다. –

5

메모리의 차이는 형태의 표현이 고유 인스턴스를 공유하기 위해 "interned"문자열을 사용한다는 것입니다 : String s = "test".

형태의 호출 : String s = "test"
String s = new String("test")

첫 번째 통화가 (존재하는 경우) 번째 전화가 사용을하지 않고 새로운 인스턴스를 생성하는 기존의 일정한 표현을 사용한다 비해 효율적 기존 인스턴스.
각 문자열 리터럴은 String 클래스의 인스턴스 (§4.3.3에 대한 참조 :

String test = new String("test"); 
String internTest = "test"; 
String nonInternTest = new String("test"); 

System.out.println(test == internTest); // prints false 
System.out.println(test != nonInternTest); // prints true 
System.out.println(test.equals(nonInternTest)); // prints true 

는 또한 JLS 따라서 할 동작을 지정 참고 : 코드 청크 아래

이 보여). String 객체는 상수 값을가집니다. 문자열 리터럴 또는 더 일반적으로 상수 표현식의 값인 문자열은 String.intern 메서드를 사용하여 고유 한 인스턴스를 공유 할 수 있도록 "격리"됩니다.

0

처음에는 String 풀에서 "Test"라는 문자열 리터럴을 검색합니다. 존재하는 경우, s가이를 참조하고 새 것을 작성하지 않습니다. "Test"리터럴이 없을 때만 새로운 객체를 만듭니다.

두 번째 경우에는 존재하는지 여부에 대해별로 신경 쓰지 않고 다른 개체를 만듭니다.

1

문자열 s = "테스트"; // 하나의 String 객체와 하나의 참조 변수를 만듭니다. 이 간단한 경우에는 "Test"가 풀에 들어가고 s가이를 참조합니다.

문자열 s = 새로운 문자열 ("테스트"); // 두 개의 객체와 하나의 참조 변수를 만듭니다. 이 경우 새 키워드를 사용했기 때문에 Java는 일반 (비공유) 메모리에 이라는 새 String 객체를 만들고이를 참조합니다. 또한 리터럴 "Test"는 이 풀에 배치됩니다.

그러나 공통점은 모두 값이 "Test"인 새 String 객체를 만들고 참조 변수 s에 할당한다는 것입니다.

0

+ 새로운 String 객체 생성과 참조 생성 사이의 차이점은 아무것도 아니지만 우리는 새로운 객체를 생성하기 위해 jvm에게 말하고 있습니다. 그리고 refence를 만드는 것은 우리가 객체를 스스로 만들고 있음을 의미합니다.

+0

질문 없습니다. – Luv

관련 문제