博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JAVA:避免重复的创建对象
阅读量:4693 次
发布时间:2019-06-09

本文共 1901 字,大约阅读时间需要 6 分钟。

  在实际开发中,重复使用同一个对象要比每次需要的时候就创建一个对象要好的多;

  作为一个比较极端的反面例子,看下面这个语句:

  String s = new String("haha");

  改语句每次被执行时都会创建一个新的String实例,如果这种用法是在一个循环中,或者是在一个被频繁调用的方法中,将会有成千上万个String实例被创建,这样的做法是没有必要的,可改进成如下这样:

  String s = “haha”;

  这个版本只使用一个String实例,而不是每次被执行的时候都创建了一个实例。对于在同一个虚拟中,运行的代码,只要包含相同的字符串字面常量,则改对象就会被重用。

  除了重用非可变的对象外,对于那些已知不会被修改的可变对象,也是可以重用它们,看个比较常见的例子:

1 public class Person{ 2     private final Date birthDate; 3  4     public Person(Date birthDate){ 5       this.birthDate = birthDate; 6     } 7  8     public boolean isBabyBoomer(){ 9       Calendar gmtCal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));10 11       gmtCal.set(1946, Calendar.JANUARY, 1, 0, 0, 0);12       Date boomStart = gmtCal.getTime();13 14       gmtCal.set(1965, Calendar.JANUARY, 1, 0, 0, 0);15       Date boomEnd = gmtCal.getTime();16 17       return birthDate.compareTo(boomStart) >= 0 && birthDate.compareTo(boomEnd) < 0;18     }19 20   }

  isBabyBoomer每次被调用的时候,都会创建一个新的Calendar, 一个新的TimeZone,两个新的Date对象,这是不必要的,下面的版本使用一个静态的初始化器,避免了上面例子的低效:

1 public class Person{ 2      private final Date birthDate; 3   4      public Person(Date birthDate){ 5        this.birthDate = birthDate; 6      } 7   8     private static final Date BOOM_START; 9     private static final Date BOOM_END;    10 11     static{12         Calendar gmtCal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));13  14      gmtCal.set(1946, Calendar.JANUARY, 1, 0, 0, 0);15      BOOM_START = gmtCal.getTime();16  17      gmtCal.set(1965, Calendar.JANUARY, 1, 0, 0, 0);18      BOOM_END = gmtCal.getTime();19     }    20 21    public boolean isBabyBoomer(){22      return birthDate.compareTo(boomStart) >= 0 && birthDate.compareTo(boomEnd) < 0;23    }24  25 }

  改进版本的Person类仅在初始化时刻创建Calendar、TimeZone和Date实例一次,而不是在每次isBadyBoomer被调用的时候创建它们。

                                                  摘自Effective java

转载于:https://www.cnblogs.com/sdlzx/p/5611408.html

你可能感兴趣的文章
类型与非类型模板函数
查看>>
c++引用
查看>>
树的dfs序直径深度重心以及拓扑排序
查看>>
结构体指针
查看>>
随机数生成函数
查看>>
CDQ分治
查看>>
引用的本质
查看>>
归并排序求逆序对
查看>>
Kejin Player
查看>>
构造函数的分类和调用
查看>>
c/c++面试大全
查看>>
拷贝构造函数调用的时机
查看>>
c++ inline函数
查看>>
构造函数与初始化列表
查看>>
c++多态的一个例子
查看>>
类对象作为类成员
查看>>
c++模板函数
查看>>
面向对象和面向过程的区别及优劣对比详解
查看>>
const与指针
查看>>
thsi指针的一些用法及作用
查看>>