2015-06-01 3 views
-2

В Java у меня есть класс под названием Пара, который имеет переменную String и int as istance. И у меня есть ArrayList, который держится на парах класса. Метод foo добавляет новые пары в cop_list ArrayList. Но также добавьте каждое сообщение в другой ArrayList, называемый msg_list.Что произойдет, если я удалю объект, у которого есть другой объект в нем, на который указывает ArrayList

foo(String msg,int id) 
{ 
    Couple cop = new Couple(msg, id); 
    //ArrayList<Couple> 
    cop_list.add(cop); 
    //ArrayList<String> 
    msg_list.add(msg); 
    ... 
} 

После этого, когда я вызвать метод удаления (ID), он должен искать и удалить пару его идентификатор, но он также должен удалить сообщение из msg_list. Итак, мой вопрос: когда я удаляю объект «Пара» из списка «cop_list», что происходит с сообщением в msg_list? msg_list все еще указывает на это, пока я явно не удалю его? String объект msg все еще находится в куче?

delete(int id) 
{ 
    //search and find the couple, save its msg in a variable 
    msg = cop.getMsg(); 
    cop_list.remove(cop); 

    //at this point, can/should i remove msg from msg_list? 
    //what happens if i call: 
    msglist.remove(msg); 
} 
+1

Проще говоря: объект продолжает жить до тех пор, пока счетчик ссылок не упадет до нуля. Одна ссылка не исчезает из-за другой ссылки на тот же объект, который был аннулирован. – laune

+1

Да, он не будет собран GC, пока не будет ссылок (это упрощенное объяснение). Когда вы выполняете msg = cop.getMsg, вы увеличиваете счетчик ссылок на этот объект. – edmarisov

+1

@laune Немного упрощенное - круговые ссылки могут быть собраны, хотя круговой характер означает, что refcount равен> 0. –

ответ

0

Итак, мой вопрос, когда я удалить объект Пара из cop_list, что происходит с сообщением в msg_list? msg_list все еще указывает на это, пока я явно не удалю его? String объект msg все еще находится в куче?

Да, у вас все еще есть ссылка на строку в вашем msg_list ArrayList, так что сообщение все еще находится в памяти. Объект не будет иметь права на сбор мусора, в то время как любые ссылки указывают на него.

1

Вам необходимо позвонить msglist.remove(msg), чтобы удалить сообщение после удаления cop из списка.
msglist все еще имеют ссылку на String с оригинала cop объект.

Когда вы звоните cop_list.remove(cop) ссылка на String в msglist по-прежнему сохраняется. Поэтому вам нужно будет удалить его явно.