2017-11-08 9 views
-1

나는 니펫을 내 샘플 코드))가변 메모리 할당은 어떻게 작동합니까?

StringBuilder downPoint=new StringBuilder().append("My").append("next").append("point"); 

System.out.println(downPoint.toString()); 

String nextPoint=new StringBuilder().append("My").append("next").append("point").toString(); 

System.out.println(nextPoint); 

2

1 문자열 빌더에 대한 새로운 객체를 생성하고 메모리 할당 작업과 무엇을 내 코드의 결과가 얼마나 그 변수를 사용하는 경우

메모리를 소비 할 수있는 변수/인스턴스 ?? "nextPoint"varaible 또는 "downPoint"변수를 사용할 때 어떤 솔루션이 더 좋습니까?

답변

1

어떤 변수/인스턴스가 메모리를 소비 할 수 있습니까?

모든 클래스가 메모리를 차지합니다. 얼마가 수업에 달려 있습니까? 모든 객체는 힙 메모리를 사용합니다. 얼마나 많은가는 그 수업에 달려 있습니다. 많은 클래스와 객체에는 다른 객체에 대한 참조가 포함되어 있으며 다른 객체는 자체 힙 메모리를 사용합니다. 일부 객체에는 고유 한 리소스가 관련되어있어 특이한 양의 메모리를 차지합니다. 로컬 변수는 해당 유형에 적합한 스택 메모리를 차지하지만 일부 경우 특정 지역 변수가 다른 스택 메모리와 동일한 스택 메모리를 공유 할 수도 있습니다. 케이스 (1)에

:

String nextPoint=new StringBuilder().append("My").append("next").append("point").toString(); 

System.out.println(nextPoint); 

nextPoint 변수는 (a 참조하지 전체 String) 스택 메모리를 사용하는 로컬 기준 변수이다. 새로운 StringBuilder 객체를 생성하고 (힙에) 힙에 3 개의 문자열을 추가하고 (각각 힙 메모리를 차지하는 객체) 그리고 새로운 String 객체를 생성하고 (힙 메모리를 차지함) 객체에 대한 참조를 저장함으로써 초기화됩니다 nextPoint. StringBuilder에는 누적 된 문자 데이터에 대한 일종의 관련 저장 공간이 있습니다. 이것은 관련된 Strings와는 중복되지 않습니다.

귀하의 사례 (2)는 생성 된 String 대신에 StringBuilder에 대한 참조가 유지된다는 점이 다릅니다. 그 다음에 오는 코드에는 의미가있을 수 있지만 어떤 개체가 만들어지고 어떤 메모리가 필요한지는 아무런 차이가 없습니다.

"nextPoint"varaible 또는 "downPoint"변수를 사용할 때 어떤 해결책이 더 좋습니까?

나중에 수행 할 작업에 따라 다릅니다. 이러한 변수 중 하나를 다시 사용하지 않으려는 경우 순전히 문체가 다릅니다.

내 코드 조각의 결과 것입니다 [?]

는 클래스에 넣어 실행하고, 자신을 위해 알아보십시오. 아니면 코드에서 알아 내십시오. 이것은 우리가 당신을 위해 대답해야 할 필요가있는 것이 아닙니다.

0

두 조각은

new StringBuilder().append("My").append("next").append("point").toString()

,

그렇게 자신의 메모리 사용량이 (대부분) 동일되고, 메소드 호출 같은 순서를 않습니다.snippet (1)은 StringBuilder에 대한 참조를 변수에 저장하고 (2) 결과 String 참조를 저장합니다. 그러나 참조가 같은 크기라면, 참조하는 것이 무엇이든 관계없이 같은 바이트 수가 차지하게됩니다.