2013-06-29 77 views
-1

我有一些关于从arrayList中删除对象的问题,如下所示,我创建了一个JComponent,将它添加到arrayList中,然后将它添加到JPanel中,之后我将它从Arraylist中移除,但它仍然坚持JPanel? 为什么对象仍然添加到Jpanel?由“添加”方法引用? 我应该jp.remove(obj),完全删除?如果不是,我该如何彻底删除它? < - 主要问题。删除GC ArrayList Java

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

}

+1

你为什么要*期望*从列表中删除它从面板中删除它? –

+0

@Jon Skeet认为它会删除对它的引用,然后GC将删除它。 –

+1

不,你已经要求它将它从列表中删除 - 所以这就是它将从中删除。如果你不能从一个集合中删除一个元素而不影响其他事物,那将是非常奇怪的。 –

回答

2

ArrayList中有没有任何关系与被绘在屏幕上的内容。在调用add(obj)之后,该对象位于JPanel中,直到您致电remove(obj)

+0

所以完全删除它,我只需要从arrList和Jpanel中删除?然后垃圾收集器照顾其余'? –

+2

@JesperTuborgMadsen如果之前有更多的引用(例如制作或准备它时),则还需要删除这些引用。 – hexafraction

+1

@Jesper垃圾收集器不会以任何方式影响您的程序。假设你有足够的RAM,你可以在GC关闭的情况下运行一个程序,程序运行完全一样。 GC的唯一工作是释放您的progrsm不再使用的内存。你作为程序员应该永远不用担心GC在做什么。 –

1

是的,只要在某个非守护线程上存在对该对象的引用,对象就会保留。

将对象添加到ArrayList只是给ArrayList一个对象的引用。当您删除该对象时,ArrayList会忘记该引用。被引用的对象只会在所有东西都忘记对象时被删除。

要彻底删除它,您必须根除所有对它的引用或可能引用它的内容。然后,垃圾回收器会在它认为需要内存时删除它的数据。

2

为什么对象仍然添加到Jpanel?

通过方法ArrList.remove(0)你实际上是从ArrayList删除对对象的引用由obj本身所引用的对象。该对象仍然在堆上。如果对象无法通过强引用进行访问,则该对象将被垃圾收集是不同的事情。但该对象不是垃圾收集,因为JPanel仍然引用该对象。

我应该jp.remove(obj),完全删除?

这样做,你从JPanel删除对象,并为垃圾收集对象资格,但你不能从堆memory.It明确删除对象是仅决定JVM当一个对象会垃圾收集。