循环语句下对象的声明

8 篇文章 0 订阅

关于对象的声明应该在for循环内还是for循环外的讨论:
看到一段别人的代码片段A如下

A

List<String> pkgIds = new ArrayList<>();
for (OResPkgBaseEntity entity : oResPkgBaseEntities) {
		if (null != entity) {
			OResPkgTopicBase oResPkgTopicBase = new OResPkgTopicBase();
			pkgIds.add(entity.getId());
			entity.setPkgBaseFields(oResPkgTopicBase);
			oResPkgTopics.add(oResPkgTopicBase);
		}
}

我自己认为正确的写法如代码B所示
B

List<String> pkgIds = new ArrayList<>();
OResPkgTopicBase oResPkgTopicBase = null;
for (OResPkgBaseEntity entity : oResPkgBaseEntities) {
		if (null != entity) {
			oResPkgTopicBase  = new OResPkgTopicBase();
			pkgIds.add(entity.getId());
			entity.setPkgBaseFields(oResPkgTopicBase);
			oResPkgTopics.add(oResPkgTopicBase);
		}
}

于是跟A代码的作者辩论:
A代码作者**😗* **从代码阅读上上述代码A是没有问题的,并且更易于理解。因为你在需要该对象的时候才去new一个对象。 **
这句话本身并无可厚非,但是从jvm角度考虑OResPkgTopicBase oResPkgTopicBase 对象的声明应该是放在for循环外的。原因如下:JVM本身存在一个垃圾回收机制,会对没有强引用的对象进行内存回收,如果使用代码A的方式,会存在OResPkgTopicBase( 对象声明)栈内存过大的问题,但是代码B则不同,只会存在一个栈内存地址

继续解释另一种demo
A’

for (int i = 0; i < 10000; ++i) {
  Object obj = new Object();
  System.out.println("obj= "+ obj);
} 

B‘’
Object obj = null;

for (int i = 0; i < 10000; ++i) {
obj = new Object();
System.out.println("obj= "+ obj);
}

这里A’和B‘就存在明确的区别。因为B‘中对象的引用已经不存在 ,对象将会被回收。对于A和B则不管对象的引用是在什么位置,都不会进行堆内存回收,因为所有对象的引用是放在List中,对象仍然存在引用。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值