그것은 좋은 연습을 만드는 물체 내부에 있습니다. 나는 쪽으로 향하고 다음과 같은 코드:
for(some condition){
SomeClass a = new SomeClass ();
System.out.println(a);
}
그래서 이것은 새 인스턴스를 만들의 SomeClass 각 반복이다. 그래서 인스턴스의 수와 같을 것입니다 번호의 반복 합니다. 그리고 이러한 나중에 수집됩니다.
그것은 더 나은 다시 사용 SomeClass 개체 내부에 루프입니다. 무언가 이것을 좋아한다:
SomeClass a = null;
for(some condition) {
a = new SomeClass();
System.out.println(a);
}
로 이해하고,두 번째 방법은 더 나은 것으로만 만들 SomeClass 객체를 한번에 다시 사용하는 그것에 반복이다. 하지만 내가 의심스럽다. 이를 확인하시기 바랍거나 알려주는 곳에 나는 기초가 잘못되었습니다.
모두를 만들에 상당한 양의 문자열이기 때문에문자열의
변경할 수 없습니다. 언제든지문자열의
할당된 새로운 가치,새로운문
이 만들어집니다.
Let's 정을 사용하는 것을 의미하는 변하는 개체의 예입니다.
옵션 1
for(some condition)
{
Object o = new Object();
System.out.println(o);
}
이것은 새로운 객체를 만들어서 오는 각 루프 반복.
2 옵션
Object o;
for(some condition)
{
o = new Object();
System.out.println(o);
}
이것이 만들어 새로운Object
o 각 루프 반복.
도에 대한 변경 가능한 객체,당신은 같은 결과를 얻을 어떤 방법!
지 않도록 주의를 혼동하는'Object'자체와'참조'는'Object':
예를 들어,다음 코드를 만듭니다(null)참조지만,어떤 객체를 만듭니다.
Object a = null;
다음 코드를 만들 boths 개체고 해당 개체에 대한 참조(참조에서 개최되는 변수라는'a'):
Object a = new Object();
작성하는 코드는 다음과 같습니다 새로운 객체와'repoints'는 기존(참조)를 변수를 가리키는 새로운 객체을 경우 변'a'이미 개최 또는 참조'a'forgots 니다. [그러나지 않는't meanother 변수가 여전히 오래된 개체 참조'a'].
a = new Object(); // it is the reference 'a' that is 're-used' here not the object...
매번 당신은 다시 실행하는 문 위의 루프에서,당신은 참으로 만드는 새로운 객체;그리고는'다시 가리키는''a'하는 새로운 객체입니다.
이전에 참조(즉,참조에서 개최'a')잊어 버린 것 각각의 시간과(가정하면 우리는 하나의 스레드 프로그램)의미하는 객체에 지적해야로 가리키는 참조에서 그것을 지는 것을 의미하는 개체는 적격한 가비지 컬렉션입니다. 이 가비지 컬렉션이 일어나는지 이 시점에서-난't know I'm 두려워합니다.
하지만 내가 말할 것:차이가 있다는 것에서 당신의 코딩의 예에서는 약관의 경우 가비지 컬렉션이 일어나지는 않는',포인터 타입'은 이미으로 정의는'Object'외부의 반복 또는 반복적으로 재정의 내 루프입니다.
다음과 같은(쓸모)예제 설명하는 데 도움이의 차이는'을 만들기--Object''점--참조'동작하는 코드에서 하나의 이동:
// This creates an object ; but we don't hold a reference to it.
public class TestClass {
public static void main(String[] args) {
for (int n=0;n<100;n++) {
new Object();
}
}
}
고를 대비:
// This creates a reference ; but no object is created
// This is identical to setting the reference to 'null'.
public class TestClass {
public static void main(String[] args) {
for (int n=0;n<100;n++) {
Object o;
}
}
}
2 지 않"나".
String="foo";
재사용 문자열에서 문자열 수 있습니다. 즉,상관없이 당신이 선언하는a
in/외부는반복
,에 차이가 없어 의 메모리에 있습니다. 하지만 그들은 범위가 다를 수 있습니다. 나는 그것이 또 다른 문제입니다.
는 경우에도 함께 편집한 버전으로 일반적으로SomeClass
,그것은 당신이 무슨 생각:
두 번째 방법은 더 나은 것으로만 만들 SomeClass 객체를 한번에 다시 사용하는 그것에 반복이다.
그것은 새로운 생성 개체를 각 루프에서 단계입니다.는
그냥 참조하여 개체입니다. 점은 경우,object(s)을 만들어 참조에 의해 다른 물체 GC 를 수집하지 않습니다 그것은,그리고 메모리를 해제. 예를 들어,이전(<=java1.6)문자열입니다.subString()메소드,그리고 원래의 문자열로char[]
,그래서 GC 지't 깨끗한 원래의 문자열입니다.
이후 주제가 변경되었습니다. 업데이트:
당신이 정말로 원하는 경우재사용한 개체를 만들이 작성하는 코드는 자신입니다. 그 이 원리를 따라:
SomeClass a = new SomeClass();
for(some condition) {
a.reset();
//do something with a
}
는SomeClass.reset()
에서 모든 세부 사항을 처리(이에 따라 귀하의 실제 사용량의 object).