这两段代码的区别
第一段代码中是不是创建了1000个局部变量obj?...
for(int i=0;i<1000;i++)
{
 Object obj=new Object();
 System.out.println("obj="+ob);
}
....Object obj=null;
for(int i=0;i<1000;i++)
{
 obj=new Object();
 System.out.println("obj="+ob);
}
//为了合理利用内存,即时回收垃圾,两段代码的优劣在哪儿?

解决方案 »

  1.   

    当然是第二段代码了
    因为,OBJECT是在外面声明的,即使有一万个也还是在原来的OBJECT对象上重新实例一下然而第一段代码,一万个就是声明一万个OBJECT的对象,然后,分别实例
      

  2.   

    只要new在循环内,就没什么节约的,何况这种使用也没必要节约喵~~``
      

  3.   


    呵呵,都说第二段好,这个说来应该是当然的,
    第一个,你用1000此申明和实例化,操作是两部,1000次循环,你想想,
    第二个,你是一次申明,然后到处实例化,呵呵,就是一个地方的同一个实质的东西,拿到不同点地方,看法不同了,就跟StringBuffer一样的啊,你前面申明一下,以后哪里都可以实例化来用,而且都是新鲜的.呵呵,你想想吧.
      

  4.   

    通常我用第二种写法时都在循环的末尾加个obj=null……虽然不知道有没有用,但的确担心会出现楼上说的错误
      

  5.   

    我强烈支持 cangyue87
    他才是真正的牛人!!!
    类的声明在定义的时候,是不占用内存空间的
    类,只有实例化它的时候,它才会分配内存空间!!!
    所以上面的两段代码,占用内存是一样的!!!
      

  6.   

    理论上 第二个肯定好。
    不过效率微乎其微。方法内部定义的变量都是局部变量,都是存在栈上面的。
    当一个语句块{},或者一个方法运行结束时,都会自动的把定义的局部变量弹出栈。
    所以不用担心变量不能及时销毁。在第一个中,哪怕你循环1W次, obj 最多也只会有一个(因为会及时弹出销毁。这和垃圾收集的原理不一样)。第二个省去了销毁的时间,不过增加了寻址的时间。
    而且,把局部变量定义在外部,可能会引起混乱,同时不便于阅读。所以我一直用的都是第一种方式。(以上只是我查阅资料,总结出来的结论。如果有说错的地方,请各位指正。)
      

  7.   

    public class ObjectTest {

    private static final Runtime s_runtime = Runtime.getRuntime(); public static void main(String[] args) {                System.out.println(s_runtime.totalMemory());
    System.out.println(s_runtime.freeMemory());
    System.out.println("....................");
    Object o = null;
    for(int i=0;i<100000;i++){
    o = new Object();;
    }
    System.out.println(s_runtime.freeMemory());
    }
    }
    把两段代码都放进去测试下就知道了