24

私は最近、Java オブジェクトによって占有されているメモリを解放することを検討していました。そうしているうちに、Javaでオブジェクトがどのようにコピーされるか(浅い/深い)、およびオブジェクトがまだ使用されているときに誤ってオブジェクトをクリア/無効にするのを避ける方法について混乱しました。

次のシナリオを検討してください。

  1. ArrayList<Object>aを引数としてメソッドに渡します。
  2. ArrayList<Object>スレッドによって処理される実行可能なクラスに aを渡します。
  3. を に入れArrayList<Object>ますHashMap

これらの場合、list = null;またはを呼び出すlist.clear();と、オブジェクトはどうなりますか? どの場合にオブジェクトが失われ、どの場合に参照のみが null に設定されますか?

オブジェクトの浅いコピーと深いコピーに関係していると思いますが、どの場合に浅いコピーが発生し、どの場合にJavaで深いコピーが発生しますか?

4

7 に答える 7

9

変数をクリアするには

私の知識によると、

変数を再利用する場合は、

               Object.clear();

再利用しない場合は、定義します

               Object=null;

注: removeAll() と比較すると、clear() の方が高速です。

私が間違っている場合は、私を修正してください....

于 2014-05-20T10:04:08.563 に答える
2

オブジェクトがどこにも参照されていない場合、Java GC は自動的にオブジェクトを要求します。したがって、ほとんどの場合、参照をnull明示的に設定する必要があります

変数のスコープが終了するとすぐに、オブジェクトは GC の対象になり、オブジェクトへの参照が他にない場合は解放されます。

Java は値渡しなので、メソッドのようにリストを設定してもnull、メソッドで渡された元の参照には影響しません。

public class A{

    private List<Integer> list = new ArrayList<Integer>();
    public static void main(String[] args) {
       A a = new A();
       B b = new B();

       b.method(a.list);

       System.out.println(a.list.size()); //Will print 0 and not throw NullPointerException
    }   

}

class B{
    public void method(List<Integer> list){
        list = null;
        //just this reference is set to null and not the original one
        //so list of A will not be GCed
    }
}
于 2013-08-02T06:23:02.263 に答える
2

メソッドに ArrayList を渡した場合、呼び出しコードなどのどこかにリストへのライブ参照がある場合、 list = null は効果がありません。コード内の任意の場所で list.clear() を呼び出すと、このリストからのオブジェクトへの参照は null になります。メソッドへの参照の受け渡しは浅いコピーではなく、値による参照の受け渡しです

于 2013-08-02T06:24:42.647 に答える