很基础的问题:求指点

feichexia 2011-06-22 10:39:11
Obj类:
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类:
import java.util.ArrayList;

public class ArrayListDemo {

public static void main(String[]args) {
ArrayList<Obj> list = new ArrayList<Obj>();
Obj obj1 = null;
for(int i=1;i<10;i++)
{
obj1 = new Obj(i);
list.add(obj1);
}

if(null!=list) {
Obj obj2 = null;
for(int i=0;i<list.size();i++) {
obj2 = list.get(i);
System.out.print(obj2.getId()+"\t");
}
}

}

}


对于第一个循环的这段代码:
Obj obj1 = null;
for(int i=1;i<10;i++)
{
obj1 = new Obj(i);
list.add(obj1);
}

如果obj1在循环外,如上,有多少个对象被创建?我认为是10个。如果obj1放在循环内,那么又有几个对象被创建呢?我认为还是10个,不知道对不对?

对于第二个循环的这段代码:
Obj obj2 = null;
for(int i=0;i<list.size();i++) {
obj2 = list.get(i);
System.out.print(obj2.getId()+"\t");
}

如果obj2放在循环外和obj2放在循环内,两者是否存在性能上的差异?


另外对于第一个循环如果这样,
Obj obj1 = null;
for(int i=1;i<10;i++)
{
obj1 = new Obj(i);
list.add(obj1);
obj1 = null;
}

据说会造成内存泄露,因为obj1虽然显式被设为null,但是它还被list引用了,不知道对不对?
...全文
173 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
lifesider 2011-06-26
  • 打赏
  • 举报
回复
不会有内存泄漏,放在循环外或者循环内性能都一样,局部变量的汇编指令是一样的
jyf19901231 2011-06-26
  • 打赏
  • 举报
回复
up一下!嘿嘿!!
feichexia 2011-06-26
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 alexandertech 的回复:]
list.add(obj1);
obj1 = null;
这不会有内存泄漏问题。
obj1被设为null后,它原来指向的对象还存活于list中,这个对象被JVM认为是active的,不会被GC回收。
唯一改变了的,只是obj1这个引用的指向而已,其它一切依然照旧。
[/Quote]
obj1设置为null,本意即为了释放,现在由于还被引用到,不能释放,这个应该是内存泄露了吧~
feichexia 2011-06-26
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 feichexia 的回复:]

引用 6 楼 cai5 的回复:

Java code

Obj obj1 = null;
for(int i=1;i<10;i++)
{
obj1 = new Obj(i);
list.add(obj1);
obj1 = null;
}


……
[/Quote]
几天前发的,我又输错了,是9个啊
yixuan 2011-06-25
  • 打赏
  • 举报
回复
同求 我是小白
飞跃颠峰 2011-06-25
  • 打赏
  • 举报
回复
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这个引用的指向而已,其它一切依然照旧。
icdpub 2011-06-25
  • 打赏
  • 举报
回复
最后一个不会导致内存泄漏吧,第二个循环不存在性能问题
feichexia 2011-06-23
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 cai5 的回复:]

Java code

Obj obj1 = null;
for(int i=1;i<10;i++)
{
obj1 = new Obj(i);
list.add(obj1);
obj1 = null;
}




ob……
[/Quote]
我数错了,我以为循环了10次
五哥 2011-06-23
  • 打赏
  • 举报
回复
如果这个在delphi中,

obj1 := Obj.create(i);
list.add(obj1);
obj1 := null;

你 后面在使用 list[i]的话,应该是为null的 ;
五哥 2011-06-23
  • 打赏
  • 举报
回复

Obj obj1 = null;
for(int i=1;i<10;i++)
{
obj1 = new Obj(i);
list.add(obj1);
obj1 = null;
}



obj1 只是对象的一个引用, = null ;只是不让他指向任何对象,你读取list.get(i)的时候 ,强转换一下应该可以吧 ;
五哥 2011-06-23
  • 打赏
  • 举报
回复

Obj obj1 = null;
for(int i=1;i<10;i++)
{
obj1 = new Obj(i);
list.add(obj1);
}


应该是创建9个对象把
TKD03072010 2011-06-22
  • 打赏
  • 举报
回复
友情UP!
feichexia 2011-06-22
  • 打赏
  • 举报
回复
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
feichexia 2011-06-22
  • 打赏
  • 举报
回复
回复内容太短了
feichexia 2011-06-22
  • 打赏
  • 举报
回复
猫人?

51,408

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧