2013-06-29 3 views
-1

아래에서 볼 수 있듯이 arrayList에서 객체를 제거하는 것과 관련하여 몇 가지 질문이 있습니다. JComponent를 만들고 ArrayList에 추가 한 다음 JPanel에 추가 한 다음 Arraylist에서 제거합니다. ,하지만 여전히 JPanel에 붙어 있습니까? 개체가 여전히 Jpanel에 추가되는 이유는 무엇입니까? "추가"방법으로 참조 할 수 있습니까? completly 제거하려면 jp.remove (obj)해야합니까? 그렇지 않은 경우 어떻게 완료합니까? < - 주요 질문입니다.Deletion 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)을 호출 한 후에는 remove(obj)을 호출 할 때까지 개체가 JPanel에 있습니다.

+0

그래서 그것을 제거하려면 arrList와 Jpanel 만 제거하면됩니다. 그럼 쓰레기 수집가가 나머지를 처리합니까? –

+2

@JesperTuborgMadsen 이전에 더 많은 참조가있는 경우 (예를 들어 만들거나 준비 할 때)이를 삭제해야합니다. – hexafraction

+1

@Jesper 가비지 수집기는 어떤 식 으로든 프로그램에 영향을주지 않습니다. 충분한 RAM이 있다고 가정하면 GC가 꺼진 상태에서 프로그램을 실행할 수 있으며 프로그램은 정확히 동일하게 실행됩니다. GC의 유일한 임무는 프로그램이 더 이상 사용하지 않는 메모리를 비우는 것입니다. 프로그래머는 GC가하는 일에 대해 걱정할 필요가 없습니다. –

1

예, 일부 비 데몬 스레드에서 개체에 대한 참조가있는 한 개체는 유지됩니다.

개체를 ArrayList에 추가하면 ArrayList에 개체에 대한 참조 만 추가됩니다. 객체를 제거하면 ArrayList는 해당 참조를 잊어 버립니다. 참조 된 객체는 모든 것이 객체를 잊어 버렸을 때만 삭제됩니다.

완전히 제거하려면 해당 참조 또는 참조 할 수있는 모든 것을 제거해야합니다. 그런 다음 가비지 수집기는 메모리가 필요하다고 생각하면 데이터를 삭제합니다.

2

개체가 여전히 Jpanel에 추가되는 이유는 무엇입니까? 당신이 실제로 ArrayList하지에서 obj 자체가 참조하는 객체를 해당 객체에 대한 참조를 제거 ArrList.remove(0) 방법으로

. 객체는 여전히 힙에 남아 있습니다. 강한 참조로 도달 할 수없는 경우 객체가 가비지 수집된다는 것은 다른 점입니다. 그러나 JPanel이 여전히 해당 개체를 참조하기 때문에 개체가 가비지 수집되지 않습니다.

completly 제거하려면 jp.remove (obj)해야합니까? 이것은 당신이 JPanel에서 개체를 제거하고 객체를 가비지 컬렉션 대상을,하지만 당신은 힙 memory.It에서 명시 적으로 개체를 제거 할 수 없습니다 이렇게함으로써

는 결정에만 JVM 인 객체가 될 것입니다 때 쓰레기 수거.