在循环体内定义对象还是在循环体外部定义对象

本文探讨了在Java循环中,对象应在循环体内定义还是外部定义的问题。传统的观点认为循环体内创建对象会导致多个引用,但通过1.8.0_101版本的测试和反编译,发现在Java 8环境下,两种方式并无实质性差异,且效率相同。这表明Java 8可能对此进行了优化,使得之前的避免在循环体内定义变量的建议不再适用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于【在循环体内定义对象还是在循环体外定义对象】这个问题网络上有很多文章写过,在循环体外定义对象的支持者更多,理由是在循环体内创建对象会有多个对象引用存在。但是我在实际测试之后认为两种写法是 没有区别 的。

测试环境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已经做了优化,这两种写法效率上没有区别。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值