-1

arrayList からのオブジェクトの削除に関していくつか質問があります。以下に示すように、JComponent を作成し、それを arrayList に追加し、JPanel に追加します。その後、Arraylist から削除しますが、まだJPパネル? オブジェクトがまだ JPanel に追加されているのはなぜですか? 「add」メソッドによって参照されますか? 完全に削除するには、jp.remove(obj) を使用する必要がありますか? そうでない場合、どうすれば完全に削除できますか? <-主な質問。

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.util.ArrayList;

import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;


public class Frame extends JFrame{
public Frame(){
    Jpanel jp = new Jpanel();
    getContentPane().add(jp);
    setPreferredSize(new Dimension(200,200));
    setVisible(true);
    pack();
}

public class Jpanel extends JPanel{

    public Jpanel(){
        ArrayList<Obj> ArrList = new ArrayList<Obj>();
        setLayout(null);
        Obj obj = new Obj();
        ArrList.add(obj);
        add(obj);
        ArrList.remove(0);
        System.out.println(ArrList);
        revalidate();
        repaint();

    }
}

public class Obj extends JComponent{
    public Obj(){
        setBounds(0,0, 100 , 100);
    }
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(Color.green);
        g.fillRect(50, 50, 50, 50);
    }
}
public static void main(String[] args) {
Frame f = new Frame();
}

}

4

3 に答える 3

2

ArrayList は、画面に描画されているものとは何の関係もありません。を呼び出した後add(obj)、オブジェクトは を呼び出すまで JPanel にありますremove(obj)

于 2013-06-29T21:05:37.530 に答える
2

オブジェクトがまだ JPanel に追加されているのはなぜですか?

メソッドによってArrList.remove(0)、実際には、それ自体が参照するオブジェクトからではなく、そのオブジェクトへの参照を削除してArrayList ますobj。オブジェクトはまだヒープに残っています。強い参照によって到達できない場合、オブジェクトがガベージコレクションされるのは別のことです。ただし、オブジェクトはまだそのオブジェクトを参照しているため、ガベージコレクションされませんJPanel

完全に削除するには、jp.remove(obj) を使用する必要がありますか?

これにより、オブジェクトをガベージ コレクションから削除し、オブジェクトJPanelをガベージ コレクションの対象にできますが、オブジェクトをヒープ メモリから明示的に削除することはできません。オブジェクトがいつガベージ コレクションされるかを決定するのは JVM だけです。

于 2013-06-29T21:11:36.333 に答える
1

はい、デーモン以外のスレッドでオブジェクトへの参照がある限り、オブジェクトは存続します。

オブジェクトを ArrayList に追加すると、ArrayList にオブジェクトへの参照が与えられるだけです。オブジェクトを削除すると、ArrayList はその参照を忘れます。参照されたオブジェクトは、すべてがオブジェクトを忘れた場合にのみ削除されます。

それを完全に削除するには、それへのすべての参照またはそれを参照する可能性のあるものを根絶する必要があります。次に、ガベージコレクターは、メモリが必要だと判断したときにデータを削除します。

于 2013-06-29T21:06:04.873 に答える