如果我删除一个对象,会发生另一个由ArrayList指向的对象

时间:2015-06-01 16:20:01

标签: java arraylist object-reference

在Java中,我有一个名为Couple的类,它有一个String和一个int作为istance变量。我有一个ArrayList,它拥有Class Couple的数据。方法foo,将新的couple添加到ArrayList cop_list。但是,将每条消息添加到另一个名为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);
   ...
}

之后,当我调用delete(id)方法时,它应该按其id搜索并删除一对,但它也应该从msg_list中删除该消息。所以,我的问题是,当我从cop_list中删除一个Couple对象时,msg_list中的消息会发生什么? msg_list仍指向它,直到我明确删除它?字符串对象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);
}

2 个答案:

答案 0 :(得分:1)

从列表中删除msglist.remove(msg)后,您必须致电cop以清除消息 msglist仍然引用原始String对象中的cop

当您致电cop_list.remove(cop)时,String中对msglist的引用仍然存在。因此,您必须明确删除它。

答案 1 :(得分:0)

  

所以,我的问题是,当我从cop_list中删除一个Couple对象时,msg_list中的消息会发生什么? msg_list仍指向它,直到我明确删除它?字符串对象msg仍然在堆上?

是的,您仍然在msg_list ArrayList中引用了String,因此该消息仍在内存中。该对象没有资格进行垃圾收集,而任何引用都指向它。