2012-04-06 7 views
3

私はいくつかの異なるArrayListに追加したオブジェクトを持っています。私はすべてのリストを変更しないようにしたいので、すべてのリストが変更されるようにポインタを変更しようとしています。しかし、私はnullにオブジェクトを設定したい場合、私はそれを働かせることはできません。例:ポインタからオブジェクトを削除するには?

ArrayList<Point> list1 = new ArrayList<Point>(); 
ArrayList<Point> list2 = new ArrayList<Point>(); 
Point a = new Point(2, 3); 
list1.add(a); list2.add(a); 

この時点で、両方のリストには同じオブジェクトを指す項目があります。値は「2,3」である。私はオブジェクトの値を変更する場合。次に、両方のリストが変更されます。

a.set(5,5); 

ここでは、両方のリストに「5,5」という値の項目があります。しかし、値をnullに設定しようとすると。

a = null; 

は今aはnullに設定されていますが、私が望んでいたようにオブジェクトの両方のリストには、まだ「5,5」とNOT NULLです。私はさらに、Pointクラスにメソッドを追加してnullに設定しようとしました。しかし、私はそれを働かせることができませんでした。ポインタだけを変更して、すべてのリストのオブジェクトを削除するにはどうすればよいですか?

+1

技術的には、Javaでは「ポインタ」ではなく「参照」です。しかしどちらの方法でも、ポインタ/リファレンスを変更してもオブジェクトは変わらないので、電話番号を変更するだけで、髪の色が変わることになります。 –

+0

私は問題の一部は、Javaでオブジェクトを削除するということはないということです。削除するまで待つだけです。 – Whymarrh

答えて

1

ポインタのみを変更してすべてのリストのオブジェクトを削除するにはどうすればよいですか?

何もありません。あなたがそれを行う方法はありません。リスト内のオブジェクトへの参照をnullにする(またはリストから削除する)場合は、は各リストに対して操作を実行する必要があります。

あなたがリストを変更することはできません場合は、次の選択肢を検討:

  1. 利用ポイントが「有効」であれば言って探しているコードを持っている余分なフィールドを持つ異なるPointクラスリストでこのフィールドをチェックします。

  2. ポイントへのnull可能参照を表すカスタムクラスを作成します。例えば

    public class PointRef { 
         private Point p; 
         public PointRef(Point p) { this.p = p; } 
         public Point get() { return p; } 
         public void invalidate() { p = null; } 
        } 
    
        ArrayList<PointRef> list1 = new ArrayList<PointRef>(); 
        ArrayList<PointRef> list2 = new ArrayList<PointRef>(); 
        PointRef a = new PointRef(new Point(2, 3)); 
        list1.add(a); list2.add(a); 
    
        ... 
    
        a.invalidate; 
        // Now both lists contain hold a PointRef that points to a null Point. 
    

しかし、これらの両方リストを使用して、その含まれているポイントは、より複雑なオブジェクトを作ります。

(ジェフリーの答えは、WeakReferenceクラスを使用して示唆されていますが、セマンティクスが間違っています。特に、GCがオブジェクトへの強い参照がないことをGCが検出した場合、ケースが必要です...私が正しくあなたの質問を理解している場合。)ちなみに


、私はあなたがあなたが提案する方法でやろうとしている何をすることができるようになる任意のプログラミング言語を考えることはできません。

1

短い答えは「いいえ」です。オブジェクトへのポインタを変更することで、オブジェクトの内容を変更することはできません。

a = null;オブジェクトではなくポインタをクリアするだけです。

5

参照変数に保持されているオブジェクトの状態を変更することができます。これは同じオブジェクトを参照するすべての変数に反映されますが、参照変数の割り当てを変更するとその変数のみに影響します。参照されるオブジェクトは変更されません。

+0

したがって、個々のリストの要素を個別にnullに設定する以外の方法はありませんか? – VIBrunazo

+1

はい。 Listオブジェクトが1つしかなく、リスト変数の束が同じListオブジェクトを参照していない限り、 –

+0

私は理解していません、あなたはそれを拡大できますか? – VIBrunazo

2

Javaでは、のオブジェクトを「正確に」参照することはできません。を削除することはできません。オブジェクトが逆参照された(それを指す参照がないことを意味する)とき、それはガベージコレクションの候補になります。 Javaのガベージコレクタは自動的にオブジェクトの削除を処理しますが、手動でメモリを管理する必要がある他の言語(C/C++が思い浮かぶ)のような操作はありません。free()あなたの質問について

:あなたはArrayListremove()方法を使用して、または手動でインデックス(list.set(index, null))指定されたリストにnullにオブジェクトを設定する両方のリストからオブジェクトを削除することもできますが、設定することで、オブジェクトを削除する方法はありませんその外部参照(リスト外のもの)はnullになります。

1

他の人も触れたように、あなたが求めていることを行う簡単な方法はありません。あなたができること、これはお勧めしません、あなたのListにはWeakReferenceが使用されています。弱い参照があっても、Pointがガベージコレクションされることはありません。

List<WeakReference<Point>> list = new ArrayList<>(); 
Point p = new Point(); 
list.add(new WeakReference<>(p)); 
System.out.println(p); 
System.out.println(list.get(0).get()); 

p = null; 

System.gc(); System.gc(); System.gc(); System.gc(); // hopefully the GC collects p by now 

System.out.println(list.get(0).get()); // null! 

それははるかになり、はるかに簡単だけに手動removeList Sの両方からPoint

関連する問題