这两段代码的区别
第一段代码中是不是创建了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);
}
//为了合理利用内存,即时回收垃圾,两段代码的优劣在哪儿?
解决方案 »
- java中char所占的字节数
- 请问:Java多媒体技术和Java Email技术那些书籍好?有没有给我推荐一下的?还有今年来,Java多媒体技术以及Email技术在国内有市场没呢?应用多么?
- serverSocket报错,代码如下,求助!!!
- 我是门外汉,求救关于catalina.sh的配置问题。
- java jmf问题?请高手进来看看
- 这样在一个函数中抛出多个异常行不行?
- Applet 访问mysql数据库问题
- 我是java新手,老师叫我写猜拳游戏,然后出了点问题!
- 一个郁闷的java函数,高手请进~~~~
- 请javascript高手帮忙!!
- 怎么用面向对象的思想来设计软件?
- NullPointerException
因为,OBJECT是在外面声明的,即使有一万个也还是在原来的OBJECT对象上重新实例一下然而第一段代码,一万个就是声明一万个OBJECT的对象,然后,分别实例
呵呵,都说第二段好,这个说来应该是当然的,
第一个,你用1000此申明和实例化,操作是两部,1000次循环,你想想,
第二个,你是一次申明,然后到处实例化,呵呵,就是一个地方的同一个实质的东西,拿到不同点地方,看法不同了,就跟StringBuffer一样的啊,你前面申明一下,以后哪里都可以实例化来用,而且都是新鲜的.呵呵,你想想吧.
他才是真正的牛人!!!
类的声明在定义的时候,是不占用内存空间的
类,只有实例化它的时候,它才会分配内存空间!!!
所以上面的两段代码,占用内存是一样的!!!
不过效率微乎其微。方法内部定义的变量都是局部变量,都是存在栈上面的。
当一个语句块{},或者一个方法运行结束时,都会自动的把定义的局部变量弹出栈。
所以不用担心变量不能及时销毁。在第一个中,哪怕你循环1W次, obj 最多也只会有一个(因为会及时弹出销毁。这和垃圾收集的原理不一样)。第二个省去了销毁的时间,不过增加了寻址的时间。
而且,把局部变量定义在外部,可能会引起混乱,同时不便于阅读。所以我一直用的都是第一种方式。(以上只是我查阅资料,总结出来的结论。如果有说错的地方,请各位指正。)
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());
}
}
把两段代码都放进去测试下就知道了