2011-12-11 6 views
0

は、浮動小数点値0.5は、それは()編を追加されたコードブロックの外からアクセスです:ArrayList.add()によるオブジェクトのインスタンス化?次の例で

ArrayList<Float> myFloatArray = new ArrayList<Float>(); 
{ 
    myFloatArray.add(0.5f); 
} 
// Data is accessible out of the block 

誰かがオブジェクトのインスタンス化の面で何が起こるか説明できますか?浮動小数点オブジェクトは、定義されたブロックを離れるときに、なぜ破壊されないのですか?それは私がこれを求めていた理由は、私が各float値に時刻情報を追加したいということです

myFloatArray.add(new Float(0.5f)); 

を書くことに相当します。私は書くために私を可能にするクラスを作成する方法について考えた:

myDataPointArray.add(new dataPoint(new GregorianCalendar(2011, 11, 11), 0.5f); 

しかし、(予想通り)、ArrayListには、ブロックデータの空の外には()編を追加しました。私はそれが助けになるかもしれないと信じているように私のクラスを不変にしようとしましたが、それはうまく動作しません。誰かが私にこの行動が記録されている正しい場所を指摘できますか?私はそれを見つけることができず、私はこのArrayListの例を超えていると思う。

+2

ヒープ上で(すなわち、「new」を介して)作成された項目は、スコープ(すなわちプログラムブロック)によって制御されるライフタイムを持たない。だから私はあなたの2番目の例が問題を引き起こしている理由を理解していない(私はリストが空であるとは思わない)。自己完結型のテストケースを作成できますか(http://sscce.org参照)? –

答えて

1

ArrayListに追加されたすべてのオブジェクトは、ArrayListがまだ使用されている限り、メモリに常駐します。 2番目の質問として、myDataPointArrayは、リストからオブジェクトを削除しない限り、追加したオブジェクトを決して解放しません。

add操作の後に新しいArrayListオブジェクトをmyDataPointArrayに再割り当てしてもよろしいですか?

+0

**追加操作の後で、新しいArrayListオブジェクトをmyDataPointArrayに再割り当てしないのですか?**はい、ありました。申し訳ありません。しかしヒープ割り当てについても学びました。皆さん、ありがとうございました。 – tos

+0

@tosうれしいこと – GETah

3

ブロックを離れるときに浮動オブジェクトが破壊されないのはなぜですか?

Javaオブジェクトはヒープ上に割り当てられているためです。スタック割り当てのような概念はありません。何かがまだオブジェクトへの参照を持っている限り(myFloatArrayにはこのオブジェクトがあります)、オブジェクトはガーベジコレクションやそれに続く破壊に適格ではありません。

1

あなたはarrayListをブロックの外側で空にしないでください。私のテストではそうではありません。

package se.wederbrand.stackoverflow; 

import java.util.ArrayList; 
import java.util.GregorianCalendar; 

public class SomeArrayStuff { 

    public static void main(String[] args) { 
    ArrayList<DataPoint> myDataPointArray = new ArrayList<DataPoint>(); 
    { 
     myDataPointArray.add(new DataPoint(new GregorianCalendar(2011, 11, 11), 0.5f)); 
    } 
    System.out.println(myDataPointArray.size()); 
    } 

    private static class DataPoint { 
    private GregorianCalendar gregorianCalendar; 
    private float v; 

    public DataPoint(GregorianCalendar gregorianCalendar, float v) { 
     this.gregorianCalendar = gregorianCalendar; 
     this.v = v; 
    } 
    } 
} 

これは、スクープ外のリストのサイズと同じように正しく出力されます。

+0

はい、あなたは本当に正しいです。私が見ていた値は、ループを終了した直後ではありませんでした。学んだ教訓 ! – tos

関連する問題