避免创建不必要的对象(Effective Java第5条)

避免创建不必要的对象,这一条告诉我们,要尽可能的重用对象。书中举了几个例子来讲解一些无意识的创建不必要的对象的情况。

1. String类的使用

1
String str = new String("abc");

上面这条代码执行过后,会生成两个对象,参数”abc”本身就是一个String对象,new String()又会产生新的String对象。

正确的做法如下:

1
String str = "abc";

无论这条语句执行多少次,对象只会有一个。

2. 自动装箱机制

1
2
3
4
5
6
7
8
long sum = 0L;
long start = System.currentTimeMillis();
for (int i = 0; i< Integer.MAX_VALUE; i++) {
sum += i;
}
long end = System.currentTimeMillis();

System.out.println(sum + " 用时: " + (end - start) + "ms");

上面这段代码在我电脑的执行时间大概是600ms。

1
2
3
4
5
6
7
8
Long sum = 0L;
long start = System.currentTimeMillis();
for (int i = 0; i< Integer.MAX_VALUE; i++) {
sum += i;
}
long end = System.currentTimeMillis();

System.out.println(sum + " 用时: " + (end - start) + "ms");

上面这段代码在我电脑的执行时间大概是15S。

相差这么多的原因只是因为下面的代码中使用了Long而不是long,这意味着每次相加完赋给sum一个新值时,都会生成一个新的Long对象,使用Long比使用long多生成了2^31个对象。

3. 方法内重复创建常量对象

情况就是一个方法每次被调用都会生成一些新的但值永远一模一样的对象。解决方法就是把这些常量对象作为类变量,然后在static语句内初始化,方法被调用时,就不需要每次都生成新对象了。

感谢