for循环new对象问题

zgd77521 2015-10-19 02:30:02
//方法一:
for(int i=0;i<10;i++){
BigDecimal money = new BigDecimal("0");
}

//方法二:
BigDecimal money = null;
for(int i=0;i<10;i++){
money = new BigDecimal("0");
}

这两个方法有什么区别吗?效率,等各方面?
...全文
2232 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
老王就是我 2018-03-16
  • 打赏
  • 举报
回复
局部变量和全局变量的区别啊,还有啥?
老王就是我 2018-03-16
  • 打赏
  • 举报
回复
问题是你想问啥?
Venk7 2017-09-04
  • 打赏
  • 举报
回复
引用 9 楼 qin34 的回复:
[quote=引用 8 楼 qq118194716 的回复:] [quote=引用 5 楼 windowsoahil 的回复:]
		double before = System.currentTimeMillis();
		for (int i = 0; i < 100000000; i++) {
			BigDecimal d = new BigDecimal("0");
		}
		double after = System.currentTimeMillis();
		System.out.println(after-before);
		before = System.currentTimeMillis();
		BigDecimal d;
		for (int i = 0; i < 100000000; i++) {
			d = new BigDecimal("0");
		}
		after = System.currentTimeMillis();
		System.out.println(after-before);
输出: 7353.0 7005.0 所以没啥大区别,肯定不是倍数关系。主要开销都在创建对象上,相差的这.3秒应该是创建局部变量引用的开销
1775.0 1644.0 我想知道你什么年代的电脑,哈哈哈[/quote] 还是你电脑性能好 我测的是 2562 2611[/quote] JDK1.8.0_131 1756.0 965.0
qin34 2017-05-06
  • 打赏
  • 举报
回复
引用 8 楼 qq118194716 的回复:
[quote=引用 5 楼 windowsoahil 的回复:]
		double before = System.currentTimeMillis();
		for (int i = 0; i < 100000000; i++) {
			BigDecimal d = new BigDecimal("0");
		}
		double after = System.currentTimeMillis();
		System.out.println(after-before);
		before = System.currentTimeMillis();
		BigDecimal d;
		for (int i = 0; i < 100000000; i++) {
			d = new BigDecimal("0");
		}
		after = System.currentTimeMillis();
		System.out.println(after-before);
输出: 7353.0 7005.0 所以没啥大区别,肯定不是倍数关系。主要开销都在创建对象上,相差的这.3秒应该是创建局部变量引用的开销
1775.0 1644.0 我想知道你什么年代的电脑,哈哈哈[/quote] 还是你电脑性能好 我测的是 2562 2611
飏飏一蝶 2015-10-24
  • 打赏
  • 举报
回复
引用 5 楼 windowsoahil 的回复:
		double before = System.currentTimeMillis();
		for (int i = 0; i < 100000000; i++) {
			BigDecimal d = new BigDecimal("0");
		}
		double after = System.currentTimeMillis();
		System.out.println(after-before);
		before = System.currentTimeMillis();
		BigDecimal d;
		for (int i = 0; i < 100000000; i++) {
			d = new BigDecimal("0");
		}
		after = System.currentTimeMillis();
		System.out.println(after-before);
输出: 7353.0 7005.0 所以没啥大区别,肯定不是倍数关系。主要开销都在创建对象上,相差的这.3秒应该是创建局部变量引用的开销
1775.0 1644.0 我想知道你什么年代的电脑,哈哈哈
zoeg 2015-10-24
  • 打赏
  • 举报
回复
变量定义在片段之外还是片段内部应该取决于你的业务逻辑要求,对象被创建N次容易理解,至于创建了多少个BigDecimal变量 用来存放这些对象的句柄,实际上完全取决于运行这段代码的JVM,也许在某些高度优化的即时编译系统中,第一种写法会自动按照第二种写法来处理,或者JVM认为这个根本毫无价值。 无视这种问题吧! 这就跟吃四季豆撕开两半,一粒一粒吃豆子,然后再一片一片吃豆瓣,吃的好细致。好处是不会吃到虫子什么的,而且有助消化,但是一般都不这么干,好像也没啥问题。 钻到这种问题里面,有点感觉是在路上看风景,耽误行程的,应该朝着最需要你学习的方向先努力。建议等个三五年,回过头来,你对这问题如果还有兴趣,再来研究!
解开者 2015-10-21
  • 打赏
  • 举报
回复
		double before = System.currentTimeMillis();
		for (int i = 0; i < 100000000; i++) {
			BigDecimal d = new BigDecimal("0");
		}
		double after = System.currentTimeMillis();
		System.out.println(after-before);
		before = System.currentTimeMillis();
		BigDecimal d;
		for (int i = 0; i < 100000000; i++) {
			d = new BigDecimal("0");
		}
		after = System.currentTimeMillis();
		System.out.println(after-before);
输出: 7353.0 7005.0 所以没啥大区别,肯定不是倍数关系。主要开销都在创建对象上,相差的这.3秒应该是创建局部变量引用的开销
sinat_31535993 2015-10-21
  • 打赏
  • 举报
回复
好像是一样的,因为javaGVM不允许同样的地址标识,却指向不同的地址,虽然第一种看似new了10个对象,但他们的引用都是一样的,所以GVM可能是回收或者覆盖机制来处理。 你可以自己测试一下,把new的对象数量放大至百万,在试试两种方式运行的时间,应该就能比较出来了
Hoshizora_Kirara 2015-10-21
  • 打赏
  • 举报
回复
变量最好定义在方法外面
心随自在飞 2015-10-19
  • 打赏
  • 举报
回复
有区别, 当然是第二种更省内存,节省资源啊!
zhufenghappy 2015-10-19
  • 打赏
  • 举报
回复
第二个效率高
这个逗b 2015-10-19
  • 打赏
  • 举报
回复
第一种 你 new 了十个东西出来。存着。 第二种 你new 了一个东西不停地给他复制

67,514

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧