for循环new对象问题

2017-05-06 12:22
//方法一:
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");
}

这两个方法有什么区别吗?效率,等各方面?

回复讨论(解决方案)



第一种 你 new 了十个东西出来。存着。


第二种 你new 了一个东西不停地给他复制
第二个效率高
有区别,
当然是第二种更省内存,节省资源啊!
好像是一样的,因为javaGVM不允许同样的地址标识,却指向不同的地址,虽然第一种看似new了10个对象,但他们的引用都是一样的,所以GVM可能是回收或者覆盖机制来处理。
你可以自己测试一下,把new的对象数量放大至百万,在试试两种方式运行的时间,应该就能比较出来了
		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秒应该是创建局部变量引用的开销
变量最好定义在方法外面
变量定义在片段之外还是片段内部应该取决于你的业务逻辑要求,对象被创建N次容易理解,至于创建了多少个BigDecimal变量 用来存放这些对象的句柄,实际上完全取决于运行这段代码的JVM,也许在某些高度优化的即时编译系统中,第一种写法会自动按照第二种写法来处理,或者JVM认为这个根本毫无价值。

无视这种问题吧!

这就跟吃四季豆撕开两半,一粒一粒吃豆子,然后再一片一片吃豆瓣,吃的好细致。好处是不会吃到虫子什么的,而且有助消化,但是一般都不这么干,好像也没啥问题。

钻到这种问题里面,有点感觉是在路上看风景,耽误行程的,应该朝着最需要你学习的方向先努力。建议等个三五年,回过头来,你对这问题如果还有兴趣,再来研究!
		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

我想知道你什么年代的电脑,哈哈哈

		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

我想知道你什么年代的电脑,哈哈哈
 还是你电脑性能好  
我测的是 2562 2611