2013-06-29 116 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當一個對象會垃圾收集。