2011-02-11 8 views
2

메모리 할당

String x = "abc"; 
String y = "abc"; 

x와 y에 대한 메모리 할당은 무엇입니까

하면?

+1

"메모리 할당이란 무엇입니까?" 또한,이 숙제는 무엇입니까? 당신은 일련의 아이폰 관련 질문을하고 있었으므로 자바 질문을 청중에게 보여주는 것이 놀랍습니다. – BoltClock

+0

"메모리 할당"이란 정확히 무엇을 의미합니까? – Argote

+0

OP가 문자열 "abc"가 인턴 될 것인가를 묻고 있다고 생각합니다. – Juliet

답변

7

두 변수는 각각 참조로 필요한만큼의 공간을 차지합니다.

문자열 리터럴의 인턴드로 인해 두 참조가 모두 동일한 값을 갖습니다. 즉, 동일한 객체를 참조합니다. 즉, String 객체는 하나뿐입니다. 그러나이 코드를 여러 번 실행하면 (동일한 클래스 로더 내에서) 적어도 xy의 값은 항상 동일한 단일 객체를 참조합니다.

두 변수

물론, 여전히 독립적 - 당신이 다른 변경하지 않고 하나를 변경할 수 있습니다 : 문자열 리터럴 풀에 배치 할 단 하나의 문자열이

String x = "abc"; 
String y = "abc"; 
x = "def"; 
System.out.println(y); // Still prints abc 
+0

모든 문자열 "수정"의 경우와 같이 변수 중 하나를 변경하면 새 Object가 만들어 지도록 추가해야합니다. – Argote

+1

@Argote, "할당하는 것은 새 Object를 만듭니다"는 말은 정확하지 않습니다. 이러한 참조 중 하나에 기존 문자열을 할당하면이 참조가 변경되지만 새로운 객체는 분명히 만들어지지 않습니다. –

+0

@Argote : 세르게이 맞습니다. 새 객체를 만드는 것은 * assignment *가 아닙니다. –

1

. 루프에서이 두 줄을 몇 번 실행하더라도 더 이상 객체가 할당되지 않습니다.

편집 : 더 많은 개체를 만들려면이 작업을 수행 할 수 있습니다.

String x = new String("abc"); // don't do this 
String y = new String("xyz"); // don't do this either. 

이렇게하면 사용자가 말했기 때문에 항상 개체가 생성됩니다. ;)

+0

String x 값 "abc"를 "xyz"로 변경하면 새로운 할당이 생성됩니까? –

+0

클래스를로드 할 때 두 개의 String 리터럴이 작성되지만 더 이상 오브젝트를 할당하지 않습니다. –

+0

@kiran, 네, 그렇다면 문자열 리터럴 "xyz"에 대해 하나의 객체와 동일한 내용을 갖고 있지만 다른 메모리 영역을 차지하는 두 개의 문자열 x와 y의 세 객체를 갖게됩니다. 그러나 그렇게하는 것은 이치에 맞지 않습니다. –

1

여기에 Java의 문자열 리터럴에 관한 nice reference이 있습니다. 난 당신이 인용에 관심이있는 것 같아요 :

동일한 데이터 를 가진 String 객체는 명시 적으로 intern()를 사용하여 일정한 식, 리터럴 문자열, 기존의 문자열에 참조, 또는 에 의해를 사용하여 생성하는 경우 방법, 참조가 동일합니다.

0

문자열 x = "abc"; 그것은 하나의 문자열 객체와 하나의 참조 변수를 생성 할 것입니다. "abc"가 풀로 들어가고 x가 그것을 참조합니다.