创建和销毁对象——避免创建不必要的对象

参考资料:《Effective Java》、《Java核心技术 卷1》

基础回顾

1.自动装箱

我们常见的基本类型,如int、long、float等,都有一个对应的包装器类。这些包装器类的名字和它们也非常对应,如:Integer、Long、Float等。

当我们像定义一个整型列表,但是尖括号里面是不允许写int的,这时候就需要用到Integer,如下:

ArrayList<Integer> arrayList=new ArrayList<Integer>();

当我们往这个集合添加数字的时候,其实就经历了自动装箱的过程

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,实际运行结果无误,但是时间却长了很多,每台机器可能不一样。

猜你喜欢

转载自www.cnblogs.com/lbhym/p/11813834.html