Effective Java 6.避免创建不必要的对象

96 阅读2分钟

一般来说,最好能重用单个对象,而不是在每次需要的时候创建一个相同功能的新对象。重用方式即快速,又流行。而且本章的标题是创建和销毁对象,避免不必要对象的创建,就可以少创建一些对象,少创建就可以少销毁,也就可以一定程度优化我们的程序

 String s = new String("bikini");//千万不要这样做

该语句每次被执行都会创建一个新的String实例,String s = "bikini"这种改进的写法,会把该字符串放入字符串常量池,下一次遇到一个String s1 = "bikini"也是会重用字符串常量池里面的同一个字符串。而new String会在堆中开辟一块空间

对于同时提供了静态工厂方法和构造器的不可变类,通常优先使用静态工厂方法而不是构造器,避免创建不必要对象。常见例子就是:

 Boolean.valueOf(String)
     
 public static Boolean valueOf(String s) {
     return parseBoolean(s) ? TRUE : FALSE;
 }

从上面这段代码可以看出,提供了两个已经创建好的常量对象,构造器在每次被调用的时候都会创建一个新的对象,而静态工厂方法则从来不要求这样做

另一种创建多余对象的方法,就是自动装箱,它允许程序员将基本类型和包装类型混用(JDK1.5后支持),自动装箱使得基本类型和包装类型之间的差别模糊起来,

在语义上有微妙的差别,在性能上也有明显的差别。

 public static void main(String[] args) {
         // sum 使用long作为数据类型会更快,而且是快很多
         Long sum = 0L;
         for (long i = 0;i<=Integer.MAX_VALUE;i++){
             sum += i;
         }
         System.out.println(sum);
 }

变量sum被声明成Long而不是long,意味着程序构造了大约2的31次方个多余的Long实例。要优先使用基本类型而不是包装类型,要当心无意识的自动装箱