关于对象的声明应该在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中,对象仍然存在引用。