参考资料:《Effective Java》、《Java核心技术 卷1》
基础回顾
1.自动装箱
我们常见的基本类型,如int、long、float等,都有一个对应的包装器类。这些包装器类的名字和它们也非常对应,如:Integer、Long、Float等。
当我们像定义一个整型列表,但是尖括号里面是不允许写int的,这时候就需要用到Integer,如下:
ArrayListarrayList=new ArrayList ();
当我们往这个集合添加数字的时候,其实就经历了自动装箱的过程
arrayList.add(3);
上面的代码实际上会自动变换成:
arrayList.add(Integer.valueOf(3));
这种变换就被称为自动装箱。
相反的,当我们将一个Integer类型的对象赋值给int时,将会自动地拆箱。
需要注意的几点:
1.Integer类型的比较要用equals。
2.装箱和拆箱时编译器认可的,而不是虚拟机。就像上面的变换一样,是由编译器去生成对应的字节码,虚拟机只是去执行这些字节码。
避免创建不必要的对象
1.最好能重用单个对象
一般来说,最好能重用单个对象,而不是在每次需要的时候就创建一个相同功能的新对象。重用方式既快速又流行。
如果对象是不可变的,它始终可以被重用。
反面例子:
String str=new String("重用对象");
上面的语句每次被执行的时候都创建一个新的String实例。改进后如下:
String str="重用对象";
上面的代码中,对于所有在同一台虚拟机中运行的代码,只要它们包含相同的字符串,该对象就会被重用。
2.优先使用静态工厂方法而不是构造器
构造器在每次被调用时都会创建一个新的对象,而静态工厂方法不会这么做。
静态工厂方法:https://www.cnblogs.com/lbhym/p/11787505.html
3.自动装箱可能会创建多余对象
要优先使用基本类型而不是包装器类。
书上给出的例子:
private static long sum(){ Long sum=0L; for(long i=0;i<=Integer.MAX_VALUE;i++){ sum+=i; } return sum; }
上面的程序必须使用long类型,因为int无法容纳int正整数的总和。
将sum声明成了Long,实际运行结果无误,但是时间却长了很多,每台机器可能不一样。