关于【在循环体内定义对象还是在循环体外定义对象】这个问题网络上有很多文章写过,在循环体外定义对象的支持者更多,理由是在循环体内创建对象会有多个对象引用存在。但是我在实际测试之后认为两种写法是 没有区别 的。
测试环境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已经做了优化,这两种写法效率上没有区别。