很基础的问题:求指点
Obj类:
- Java code
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; }}
ArrayListDemo类:
- Java code
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"); } } }}
对于第一个循环的这段代码:
- Java code
[color=#FF0000]Obj obj1 = null;[/color] for(int i=1;i<10;i++) { obj1 = new Obj(i); list.add(obj1); }
如果obj1在循环外,如上,有多少个对象被创建?我认为是10个。如果obj1放在循环内,那么又有几个对象被创建呢?我认为还是10个,不知道对不对?
对于第二个循环的这段代码:
- Java code
[color=#FF0000]Obj obj2 = null;[/color] for(int i=0;i<list.size();i++) { obj2 = list.get(i); System.out.print(obj2.getId()+"\t"); }
如果obj2放在循环外和obj2放在循环内,两者是否存在性能上的差异?
另外对于第一个循环如果这样,
- Java code
[color=#FF0000]Obj obj1 = null;[/color] for(int i=1;i<10;i++) { obj1 = new Obj(i); list.add(obj1); obj1 = null; }
据说会造成内存泄露,因为obj1虽然显式被设为null,但是它还被list引用了,不知道对不对?
[解决办法]
友情UP!
[解决办法]
- Java code
[color=#FF0000]Obj obj1 = null;[/color] for(int i=1;i<10;i++) { obj1 = new Obj(i); list.add(obj1); }
[解决办法]
- Java code
[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一下!嘿嘿!!
[解决办法]
不会有内存泄漏,放在循环外或者循环内性能都一样,局部变量的汇编指令是一样的