생체 내부 루프

그것은 좋은 연습을 만드는 물체 내부에 있습니다. 나는 쪽으로 향하고 다음과 같은 코드:

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 객체를 한번에 다시 사용하는 그것에 반복이다. 하지만 내가 의심스럽다. 이를 확인하시기 바랍거나 알려주는 곳에 나는 기초가 잘못되었습니다.

질문에 대한 의견 (20)
해결책

의 차이점은 당신의 두번째 경우,a변수는 여전히 될 때 범위에 루프를 넘

다른 것보다,그들이'다시 기본적으로 동일한,심지어에서 가비지 컬렉션의 관점입니다.

문자열을 참조 형태(이기는 하지만 변경할 수 없는 사람),그리고는't 이 정말 중요 여부를 선언하고 새로운 변수들을 위해 또는 그냥 덮어쓰기는 동일한 변수다. You'다시 만드는 여전히 새로운 문자열 모든 시간입니다.

해설 (4)

모두를 만들에 상당한 양의 문자열이기 때문에문자열의변경할 수 없습니다. 언제든지문자열의할당된 새로운 가치,새로운이 만들어집니다.

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);
}

이것이 만들어 새로운Objecto 각 루프 반복.

도에 대한 변경 가능한 객체,당신은 같은 결과를 얻을 어떤 방법!

해설 (5)

지 않도록 주의를 혼동하는'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
해설 (2)

당신은 혼란한 변수를 할당 개체하는 객체를 인스턴스입니다.

모두 코드 샘플을 만들 해당하는 금액의 개체입니다. 두 번째는 것이지 하나의 인스턴스에서 더 큰 범위,따라서 그것을 위해 사용할 수 있는 더 이상 시간.

해설 (0)

2 지 않"나".

String="foo";재사용 문자열에서 문자열 수 있습니다. 즉,상관없이 당신이 선언하는ain/외부는반복,에 차이가 없어 의 메모리에 있습니다. 하지만 그들은 범위가 다를 수 있습니다. 나는 그것이 또 다른 문제입니다.

는 경우에도 함께 편집한 버전으로 일반적으로SomeClass,그것은 당신이 무슨 생각:

두 번째 방법은 더 나은 것으로만 만들 SomeClass 객체를 한번에 다시 사용하는 그것에 반복이다.

그것은 새로운 생성 개체를 각 루프에서 단계입니다.그냥 참조하여 개체입니다. 점은 경우,object(s)을 만들어 참조에 의해 다른 물체 GC 를 수집하지 않습니다 그것은,그리고 메모리를 해제. 예를 들어,이전(<=java1.6)문자열입니다.subString()메소드,그리고 원래의 문자열로char[],그래서 GC 지't 깨끗한 원래의 문자열입니다.

해설 (1)

유일한 차이는 두 번째 경우에는 변수는 여전히 될 때 범위에 반복을 통해,아니다. 객체의 생성되는 두 경우에는 동일한 문자열로 변경할 수 없

당신은 단지 질문을 편집에 아직도 이 경우 새로운 객체 생성 메모리에서 각 반복 모두 사례

해설 (0)

에 따라 내 지식에 더 큰 응용 프로그램(아이)그러나 더 큰 잘 사용하는정적 블록에 대한 개체 생성-기 때문에 정적 블록의 코드를 실행할 때 한 번만 클래스를 로드 메모리입니다. 기술적으로,당신은 수 있습니다 여러 정적 블록 클래스에서 있지만,그것은 큰 의미가 없

기억정적 블록에만 액세스할 수 있는 정적 변수 및 방법

해설 (3)

그것은 모든 범위

당신이 경우에 당신의 두 번째 방법:

SomeType someFunction(){
   ...
    SomeClass a = null;

    for(some condition) {
        a = new SomeClass();

           System.out.println(a);
        }
     ...
     return something
    }

체는 것이 존재하는 메모리에서의 마지막까지someFunction하는 동안 첫 번째 방법은,그것의 라이프사이클 내에서 단일의 반복 루프

해설 (0)

이후 주제가 변경되었습니다. 업데이트:

당신이 정말로 원하는 경우재사용한 개체를 만들이 작성하는 코드는 자신입니다. 그 이 원리를 따라:

SomeClass a = new SomeClass();

for(some condition) {
    a.reset();
    //do something with a
}

SomeClass.reset()에서 모든 세부 사항을 처리(이에 따라 귀하의 실제 사용량의 object).

해설 (11)