日期:2014-05-20 浏览次数:20618 次
public class Obj { private int id; public Obj() { } public Obj(int id) { this.id = id; } public int getId() { return id; } public void setId(int id) { this.id = id; } }
import java.util.ArrayList; public class ArrayListDemo { public static void main(String[]args) { ArrayList<Obj> list = new ArrayList<Obj>(); [color=#FF0000]Obj obj1 = null;[/color] for(int i=1;i<10;i++) { obj1 = new Obj(i); list.add(obj1); } if(null!=list) { [color=#FF0000]Obj obj2 = null;[/color] for(int i=0;i<list.size();i++) { obj2 = list.get(i); System.out.print(obj2.getId()+"\t"); } } } }
[color=#FF0000]Obj obj1 = null;[/color] for(int i=1;i<10;i++) { obj1 = new Obj(i); list.add(obj1); }
[color=#FF0000]Obj obj2 = null;[/color] for(int i=0;i<list.size();i++) { obj2 = list.get(i); System.out.print(obj2.getId()+"\t"); }
[color=#FF0000]Obj obj1 = null;[/color] for(int i=1;i<10;i++) { obj1 = new Obj(i); list.add(obj1); obj1 = null; }
[color=#FF0000]Obj obj1 = null;[/color] for(int i=1;i<10;i++) { obj1 = new Obj(i); list.add(obj1); }
------解决方案--------------------
[color=#FF0000]Obj obj1 = null;[/color] for(int i=1;i<10;i++) { obj1 = new Obj(i); list.add(obj1); obj1 = null; }
------解决方案--------------------
obj1,obj2事实上都是引用
对第一个循环,放在里面或外面,都是创建9个对象。因为obj1 = null;这条语句并没有创建对象,只是创建了一个引用。
对第2个循环,放在里面性能不如放在外面,因为如果obj2 = null;放在循环里面,它被执行9次,将比放在外面多创建8个引用。之后obj2 = list.get(i); obj2被赋值指向给list.get(i),之前9次创建的引用都没有意义。
list.add(obj1);
obj1 = null;
这不会有内存泄漏问题。
obj1被设为null后,它原来指向的对象还存活于list中,这个对象被JVM认为是active的,不会被GC回收。
唯一改变了的,只是obj1这个引用的指向而已,其它一切依然照旧。
------解决方案--------------------
同求 我是小白
------解决方案--------------------
up一下!嘿嘿!!
------解决方案--------------------
不会有内存泄漏,放在循环外或者循环内性能都一样,局部变量的汇编指令是一样的