日期:2014-05-20  浏览次数:20618 次

很基础的问题:求指点
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一下!嘿嘿!!
------解决方案--------------------
不会有内存泄漏,放在循环外或者循环内性能都一样,局部变量的汇编指令是一样的