for (int i = 0; i < 5; i++) {
Person p = new Person();
p.setName("name" + i);
l.add(p);
p = null;
}

for(Person p : l){
System.out.println(p.getName());
}for (int i = 0; i < 5; i++) {
Person p = new Person();
p.setName("name" + i);
l.add(p);
}

for(Person p : l){
System.out.println(p.getName());
}

解决方案 »

  1.   

    对于这个例子这样加没意义。因为p的生命结束于for的{}
      

  2.   

    new的对象可以立即释放掉   由于前面对象new出来后   java虚拟机会对其分配相应的内存地址,当最后处理完成后 赋值为null可以立即释放掉这个内存  如果没有这个也是可以的  那么等gc自己去回收释放吧
      

  3.   

    我们循环申请Person对象,并将所申请的对象放入一个List中,如果我们仅仅释放引用本身,那么List仍然引用该对象,所以这个对象对GC来说是不可回收的。因此,如果对象加入到List后,还必须从List中删除,最简单的方法就是将Person对象设置为null。
      

  4.   

    有用,心理作用。
    面向对象编程总把对象付空本身就别扭。
    如果真有影响那估计jvm升级的时候应该会弥补类似漏洞。
    个人认为不用考虑类似问题。
      

  5.   


    在这个例子中没有意思。p和add到list中的引用,都是指向同一个new出来的person对象,即p=null,被new出来的person对象还被list引用着,所以new出来的persion对象也不会被回收,而p本身的生命周期在for的花括号内,即程序走到花括号的}时,p自己没释放了,所以刻意去让p指向一个null对象也就没什么意义了。
    另外,当调用xxx=null时,那只是相当于告诉回收器xxx自己不再引用原来所引用的对象了(就相当于把对象引用的计数器减1),如果原来所引用的对象没有被其他引用继续引用的话(也就是对象引用的计数器为0),那么回收器就可以对原来所引用的对象回收了(这里不一定是及时回收)