В 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);
}
Проще говоря: объект продолжает жить до тех пор, пока счетчик ссылок не упадет до нуля. Одна ссылка не исчезает из-за другой ссылки на тот же объект, который был аннулирован. – laune
Да, он не будет собран GC, пока не будет ссылок (это упрощенное объяснение). Когда вы выполняете msg = cop.getMsg, вы увеличиваете счетчик ссылок на этот объект. – edmarisov
@laune Немного упрощенное - круговые ссылки могут быть собраны, хотя круговой характер означает, что refcount равен> 0. –