for 循环里,重复构造同一对象多次的性能问题。

Thinking_In_IT 2009-10-16 09:31:45
1)写法1,重复构造同一对象多次
String orgCodeInclude="";

for(int i=0;i<list.size();i++){
AuthOrgInfoPo authOrgInfoPo=(AuthOrgInfoPo)list.get(i);
orgCodeInclude+=authOrgInfoPo.getOrgCode()+",";
}

2)写法2,重用对象

String orgCodeInclude="";
AuthOrgInfoPo authOrgInfoPo=null;

for(int i=0;i<list.size();i++){
authOrgInfoPo=(AuthOrgInfoPo)list.get(i);
orgCodeInclude+=authOrgInfoPo.getOrgCode()+",";
}

请问:这两种写法都有何利弊?!欢迎各位朋友赐教
...全文
446 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
swandragon 2009-10-17
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 rascalboy520 的回复:]
没有太大的区别啊,都没有建筑新对象,没有new操作的
其它下面这样才会有问题:
for(...) {
  A a = new A();
  ......
}
[/Quote]
同意
Thinking_In_IT 2009-10-16
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 djt_1982 的回复:]
第一种比第二种稍微好一点点,

这个性能主要差在+","

用StringBuffer orgCodeInclude;性能会比用String orgCodeInclude好上许多。


StringBuffer orgCodeInclude= new StringBuffer();

for(int i=0;i <list.size();i++){
AuthOrgInfoPo authOrgInfoPo=(AuthOrgInfoPo)list.get(i);
orgCodeInclude.append(authOrgInfoPo.getOrgCode());
orgCodeInclude.append(',');
}
[/Quote]

感谢你的回复,这个大部分JAVA程序员都是清楚的。
Thinking_In_IT 2009-10-16
  • 打赏
  • 举报
回复
感谢各位朋友的探讨。
我的疑问的重点是:
第一种循环
for(int i=0;i <list.size();i++){
AuthOrgInfoPo authOrgInfoPo=(AuthOrgInfoPo)list.get(i);
}
与第二种循环
AuthOrgInfoPo authOrgInfoPo=null;
for(int i=0;i <list.size();i++){
authOrgInfoPo=(AuthOrgInfoPo)list.get(i);
}

的性能对比。第一种循环,会多次 new AuthOrgInfoPo ()对象,对象的数量取决与list.size(),而第二种循环只new AuthOrgInfoPo ()对象一次,循环中重用了authOrgInfoPo对象。这两种方式哪种好一点呢?
我们可以从以下角度思考:
1)代码可读性
2)程序性能开销
3)垃圾回收机制(GC)
……

望各位 “大牛” 、“小牛”、“大侠”、“小虾”赐教。

lzh_me 2009-10-16
  • 打赏
  • 举报
回复
在for循环体中
AuthOrgInfoPo authOrgInfoPo=(AuthOrgInfoPo)list.get(i);
AuthOrgInfoPo authOrgInfoPo=null;
for(int i=0;i <list.size();i++){
authOrgInfoPo=(AuthOrgInfoPo)list.get(i);
的比较。个人觉得第二种比较好点,对象少。
至于性能上,对象引用的应该是内存的地址吧,我对底层的不是很了解,所以无法下结论哪个好一些。

第一种情况一般在类似于往Bean对象里存东西时的用法。

a34020249 2009-10-16
  • 打赏
  • 举报
回复
第二种会好点
sj2love0qh 2009-10-16
  • 打赏
  • 举报
回复
第二种 可能会好一些。
在内存中创建的对象要少
djt_1982 2009-10-16
  • 打赏
  • 举报
回复
第一种比第二种稍微好一点点,

这个性能主要差在+","

用StringBuffer orgCodeInclude;性能会比用String orgCodeInclude好上许多。


StringBuffer orgCodeInclude= new StringBuffer();

for(int i=0;i <list.size();i++){
AuthOrgInfoPo authOrgInfoPo=(AuthOrgInfoPo)list.get(i);
orgCodeInclude.append(authOrgInfoPo.getOrgCode());
orgCodeInclude.append(',');
}
luallen 2009-10-16
  • 打赏
  • 举报
回复
第二种 可能会好一些。
liwenso 2009-10-16
  • 打赏
  • 举报
回复
第2个看起来少建许多引用对象。
可能编译器已经做过优化,具体上性能没有差别
wanli209 2009-10-16
  • 打赏
  • 举报
回复
String orgCodeInclude="";

for(int i=0,j=list.size();i < j;i++){
orgCodeInclude+=(AuthOrgInfoPo)list.get(i).getOrgCode()+",";
}
wanli209 2009-10-16
  • 打赏
  • 举报
回复
这样不行吗
String orgCodeInclude="";

for(int i=0;i <list.size();i++){
orgCodeInclude+=(AuthOrgInfoPo)list.get(i).getOrgCode()+",";
}

个人觉得 第二种要好 占用资源少,实例化对象少 ,速度应该要快。
  • 打赏
  • 举报
回复
能看看完整点的程序么
sunnyfun888 2009-10-16
  • 打赏
  • 举报
回复
第二个因为变量作用域在循环外,如果list被销毁,他里面的对象并不会被全部释放,因为authOrgInfoPo引用了一个,在某种意义上(某段代码之间)造成了“内存泄漏”
sunnyfun888 2009-10-16
  • 打赏
  • 举报
回复
第一个变量作用域在循环内,理论上每循环一次都要销毁一次变量,实际上会有优化的
快乐的2 2009-10-16
  • 打赏
  • 举报
回复
字串连接那是用StringBuffer,感觉第二种应该好点,第一种每个循环里面每次都创建一个变量引用,好像会在栈内堆积吧.第二种只创建一个引用,每次循环只是修改引用位置,两个方法都没有回收的,因为你的值是从List中取出来的,里面的Object总是有由List内部的变量名引用的,所以虚拟机不会回收.
liuqinblue 2009-10-16
  • 打赏
  • 举报
回复
如果循环少于百万,性能没有差异,若高于,第二种微高于第一种.

如果字符串长度经常变化,建议使用StringBuffer,但jdk1.4后,String 的 "+" 号会自动转换成StringBuffer的append()

但如果是C# ,循环里面使用 StringBuffer,比 String "+" 效率会高N倍
dinghun8leech 2009-10-16
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 dinghun8leech 的回复:]
String操作频繁要使用StringBuffer,其他的话新建实例对象我觉得浪费不了多少性能。
我比较赞同第一种写法,可读性高一点,不容易出乱子。
另外楼主可以试试在for循环外建立一个List,然后使用1、2种方法分别往List里放循环内放新生成的对象,可以就拿String为例。看看会发生什么。
如果不出意外的话,方法2 list中的String全都会变成最后插入的那个值,确切的说,应该是list中存了n份同样的引用句柄,所以引用地址一变,所有都变。
因此我通常使用方法1,不容易搞错。
[/Quote]
以上的是错的啊,大家别看啊,抱歉、、、、、、
dinghun8leech 2009-10-16
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 dinghun8leech 的回复:]
String操作频繁要使用StringBuffer,其他的话新建实例对象我觉得浪费不了多少性能。
我比较赞同第一种写法,可读性高一点,不容易出乱子。
另外楼主可以试试在for循环外建立一个List,然后使用1、2种方法分别往List里放循环内放新生成的对象,可以就拿String为例。看看会发生什么。
如果不出意外的话,方法2 list中的String全都会变成最后插入的那个值,确切的说,应该是list中存了n份同样的引用句柄,所以引用地址一变,所有都变。
因此我通常使用方法1,不容易搞错。
[/Quote]

抱歉,俺搞错了,等等。。。。。。。。。。
ABAP1314 2009-10-16
  • 打赏
  • 举报
回复
相比之下 第二种 好些···

第一种 相当于 每次循环都的开辟个内存空间 再把值赋予它 不太好哦
dinghun8leech 2009-10-16
  • 打赏
  • 举报
回复
String操作频繁要使用StringBuffer,其他的话新建实例对象我觉得浪费不了多少性能。
我比较赞同第一种写法,可读性高一点,不容易出乱子。
另外楼主可以试试在for循环外建立一个List,然后使用1、2种方法分别往List里放循环内放新生成的对象,可以就拿String为例。看看会发生什么。
如果不出意外的话,方法2 list中的String全都会变成最后插入的那个值,确切的说,应该是list中存了n份同样的引用句柄,所以引用地址一变,所有都变。
因此我通常使用方法1,不容易搞错。
加载更多回复(7)

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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