2012-06-24 3 views
6

다음 코드로 생성 할 문자열 개체 수는 얼마나됩니까?얼마나 많은 문자열 객체가 메모리에 생성됩니까?

String s=""; 
s+=new String("a"); 
s+="b"; 

나는이 질문을 시험에서 받았다. 나는 옳은 대답을 알고 싶다. 나는 2 개의 물건을 말했다.
새 문자열 ("a")에 의해 생성 된 "", "b"및 개체가 포함 된 풀의 개체.

+3

? 우리는 그 사실을 모른 채 당신의 질문에 정말로 대답 할 수 없습니다. –

+1

http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#String%28java.lang.String%29 –

답변

8

문자열 s = "";

은 개체를 만들지 않습니다.

s + = new String ("a");

은 5 개의 개체를 생성합니다. new String, StringBuilder와 그 char [] 및 결과의 String 및 char []

s + = "b";

네 개의 객체를 생성하고, 모두 StringBuilder와 문자 [] 및 결과 문자열과 문자는 []

그래서 나는 세 개의 문자열

주 객체입니다 구 개체의 총 수 : ClassLoader 및 Class를 비롯한 많은 시스템 클래스에 ""이 이미로드되어 있는지 확인할 수 있습니다.

문자열 "a"와 "b"는이 질문의 목적 상 새로운 문자열로 간주되거나 그렇지 않을 수 있습니다. IMHO 나는 단지 한 번만 생성 될 것이므로이 코드는 한 번만 실행되므로 얼마나 많은 문자열이 생성되는지는 중요하지 않습니다. 유용한 것은 코드가 실행될 때마다 얼마나 많은 객체가 생성되는지를 아는 것입니다.

+0

코드가 컴파일되지 않습니다 (보다 구체적으로 다음 행' s + = new String ("a");'). 어떻게 런타임에 생성 된 객체 수를 계산할 수 있었습니까? –

+6

질문은 String 인스턴스에 관한 것입니다. 객체 만이 아닙니다. –

+0

@DarinDimitrov 제 IDE와 컴파일러가 컴파일을한다고합니다. 문제는 무엇입니까? –

9

내가 다른 anwser 것, 명확한 질문 : 문자열 인스턴스가 다음 코드 조각에 관련된 몇 :

String s=""; 
s+=new String("a"); 
s+="b"; 

그리고 대답은 6입니다 :

  • 빈 문자열 리터럴 : "";
  • 문자열 리터럴 "a";
  • 문자열 리터럴 "a"의 복사본 : new String("a");
  • s"a"의 사본을 연결하여 생성 된 문자열.
  • s"b"을 연결하여 만든 문자열 "b" 리터럴 문자열.

이전에로드 된 코드에 의해 세 개의 String 리터럴이 이미 생성되었다고 가정하면 코드 조각은 3 개의 새 String 인스턴스를 만듭니다.

+0

문자열 s1 = 새 문자열 ("hello"); , 얼마나 많은 참조가 JVM 수준에서 생성됩니까? 나는 두 가지 객체를 안다. 즉, "hello"에 대한 클래스 로딩시 1, 명령 실행의 실제 시간에 1. 1 참조가 s1, 내 의심 스러워요 "새로운 문자열()"생성자에 전달되는 클래스 로딩에서 "안녕하세요"문자열의 결과입니다 2 참조 s2가있다. 자바에서는 함수 나 생성자에서 객체 자체를 전달할 수있는 방법이 없으며 참조 만 전달할 수 있습니다. 또한 새 문자열 ("hello")의 결과 여야하고 s1에 할당 된 세 번째 참조 s3이 있어야합니다. –

0

실제로 JITC 상황에서 생성 된 개체의 수는 불확정합니다.JITC는 new String("a")이 신원이라는 것을 잘 알고 있으며 s의 중간 값은 참조되지 않으므로 StringBuilder 만 생성됩니다. 일반적인 경우 (예 : new String()에 대한 인수가 유효하지 않을 수도 있음)에 모방되어야하는 몇 가지 잠재적 인 부작용이 있지만 리터럴이 발생할 수는 없습니다.

실제로 javac는 잠재적 인 부작용이없는 "ab"라는 결과를 매우 잘 인식하고 그 값의 문자열 리터럴을 생성합니다. (그것은 문자열이 약간 덜 복잡한 사건에 결합한다.)

0

앞서 우리는 문자열을 만드는 다양한 방법 사이의 미묘한 차이에 대해 더 이야기하기로 약속 새로운 문자열을 만듭니다. 의는 문자열이 생성 될 수있는 방법에 몇가지 예를 들어 살펴 보자,하고의 더 다른 String 객체가 풀에 존재하지 않는 것으로 가정하자 :이 간단한 경우

String s = "abc"; // creates one String object and one reference variable 

, "ABC"갈 것이다 풀장에서 그것을 참조 할 것입니다. 우리는 new 키워드를 사용하기 때문에이 경우

String s = new String("abc"); // creates two objects, and one reference variable 

는 자바 정상 (nonpool) 메모리에 새로운 String 객체를 생성하며, s는이를 참조됩니다. 또한 리터럴 "abc"가 풀에 배치됩니다.

자바 6 학습 가이드에 대한 SCJP 일 공인 프로그래머에서

(시험 310-065) .PDF`b`는 무엇입니까

관련 문제