关于【在循环体内定义对象还是在循环体外定义对象】这个问题网络上有很多文章写过,在循环体外定义对象的支持者更多,理由是在循环体内创建对象会有多个对象引用存在。但是我在实际测试之后认为两种写法是 没有区别 的。
测试环境Java版本:1.8.0_101
反编译工具:Java Decompiler
测试代码如下
- 在循环体内定义对象
package other.defineVarInLoop;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
class DefineVarInLoop
{
public static void main(String[] args)
{
List<Map<String, Object>> mapList = new ArrayList<Map<String,Object>>();
for (int i = 0; i < 20; i++)
{
Map<String, Object> tmpMap = new HashMap<String, Object>();
tmpMap.put("a", 1);
tmpMap.put("b", 2);
mapList.add(tmpMap);
}
}
}
- 在循环体内定义对象 反编译之后的代码
package other.defineVarInLoop;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
class DefineVarInLoop
{
public static void main(String[] args)
{
List<Map<String, Object>> mapList = new ArrayList();
for (int i = 0; i < 20; i++)
{
Map<String, Object> tmpMap = new HashMap();
tmpMap.put("a", Integer.valueOf(1));
tmpMap.put("b", Integer.valueOf(2));
mapList.add(tmpMap);
}
}
}
- 在循环体外定义对象
package other.defineVarInLoop;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
class DefineVarOutLoop
{
public static void main(String[] args)
{
Map<String, Object> tmpMap;
List<Map<String, Object>> mapList = new ArrayList<Map<String,Object>>();
for (int i = 0; i < 20; i++)
{
tmpMap = new HashMap<String, Object>();
tmpMap.put("a", 1);
tmpMap.put("b", 2);
mapList.add(tmpMap);
}
}
}
- 在循环体外定义对象 反编译之后生成的代码
package other.defineVarInLoop;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
class DefineVarOutLoop
{
public static void main(String[] args)
{
List<Map<String, Object>> mapList = new ArrayList();
for (int i = 0; i < 20; i++)
{
Map<String, Object> tmpMap = new HashMap();
tmpMap.put("a", Integer.valueOf(1));
tmpMap.put("b", Integer.valueOf(2));
mapList.add(tmpMap);
}
}
}
因为反编译之后生成的代码是一样的,所以我认为这两种写法在Java 8 环境下是没有区别的。
之前版本确实有【尽量不要在循环体内定义变量】的建议,但是看测试结果在Java 8已经做了优化,这两种写法效率上没有区别。
本文探讨了在Java循环中,对象应在循环体内定义还是外部定义的问题。传统的观点认为循环体内创建对象会导致多个引用,但通过1.8.0_101版本的测试和反编译,发现在Java 8环境下,两种方式并无实质性差异,且效率相同。这表明Java 8可能对此进行了优化,使得之前的避免在循环体内定义变量的建议不再适用。
9752

被折叠的 条评论
为什么被折叠?



