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

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

String s = new String("haha");

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

String s = “haha”;

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

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

1 public classPerson{2     private finalDate birthDate;3

4     publicPerson(Date birthDate){5       this.birthDate =birthDate;6 }7

8     public booleanisBabyBoomer(){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 classPerson{2     private finalDate birthDate;3

4     publicPerson(Date birthDate){5       this.birthDate =birthDate;6 }7

8 private static finalDate BOOM_START;9 private static finalDate 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 booleanisBabyBoomer(){22     return birthDate.compareTo(boomStart) >= 0 && birthDate.compareTo(boomEnd) < 0;23 }24

25 }

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

摘自Effective java

java对象重用_JAVA:避免重复的创建对象相关推荐

  1. java 对象复活_Java对象复活

    java 对象复活 总览 收集覆盖了finalize()的对象之后,将其添加到终结处理队列中,以在调用每个对象的finalize()方法之后进行清理. 如果您复活了物体,会发生什么? 何时定案? fi ...

  2. java 对象读写_java 对象输入输出流读写文件的操作实例

    java 对象输入输出流读写文件的操作实例 java 支持对对象的读写操作,所操作的对象必须实现Serializable接口. 实例代码: package vo; import java.io.Ser ...

  3. java 对象结构_java对象的结构

    在Hotspot JVM中,32位机器下,Integer对象的大小是int的几倍? 我们都知道在Java语言规范已经规定了int的大小是4个字节,那么Integer对象的大小是多少呢? 要知道一个对象 ...

  4. java 对象深拷贝_java深入理解浅拷贝和深拷贝

    简介 拷贝对象是java中经常会遇到的问题.java中存在两种类型,基础类型和引用类型. java的赋值都是传值的,对于基础类型来说,会拷贝具体的内容,但是对于引用对象来说,存储的这个值只是指向实际对 ...

  5. java对象复制_Java对象的深层复制与浅层复制

    TestVO a = new TestVO(); a.setName("xiemingmei"); a.setBirthPlace("Hunan"); Test ...

  6. java 对象乱码_java对象乱码怎么办

    java对象乱码怎么办,乱码,方式,数据库,要用,解决办法 java对象乱码怎么办 易采站长站,站长之家为您整理了java对象乱码怎么办的相关内容. java对象乱码的解决办法:1.文件下载乱码时,下 ...

  7. java 对象工厂_Java设计模式之--工厂方式

    在分析工厂模式之前,我们先看看普通模式下的Java三层结构. Controller(表现层)-Service(业务层)-Dao(持久层.数据库连接层),基于此三层结构完成JavaWeb相关业务. 假设 ...

  8. java 对象 方法_java——类、对象、方法

    一.类 1.Java语言把一组对象中相同属性和方法抽象到一个Java源文件就形成了类. 一个java文件可以有多个类,但是每一个类都会生成一个class字节码文件. 如果class 前加public ...

  9. java 对象初始化_Java对象初始化

    自动初始化(默认值) 一个类的所有基本数据成员都会得到初始化,运行下面的例子可以查看这些默认值: classDefault{booleant;charc;byteb;shorts;inti;longl ...

最新文章

  1. Makefile —— Makefile的规则是什么?make是如何工作的?make的工作方式是什么?
  2. 爱上MVC~为DisplayNameFor添加扩展,支持PagedList集合
  3. python六十五:描述符(__get__, __set__, __delete__)
  4. android 解决setbackgrounddrawable过时
  5. 你最喜欢哪款游戏的界面风格,为什么?
  6. 祭奠被遗忘的冒泡排序
  7. Zookeeper之事件监听机制
  8. DXperience 7.1.1
  9. somachine3.1安装
  10. Linux中设置Java程序开机自动运行
  11. TR069协议与商业应用6——TR069动态库开发
  12. PHP面试技巧 之 职场暗语知多少?!
  13. gopher对mysql的利用_gopher协议的攻击利用
  14. 分布式环境下限流方案的实现
  15. python arp断网攻击_ARP断网攻击的原理与解决方法讲解 | 小马激活官网
  16. excel怎么一个格子斜分_excel如何在单元格里加上斜线分割内容
  17. 论文学习笔记:通用对抗扰动UAP
  18. C语言实验——某年某月的天数
  19. 制作一个html文件 效果如下图,网页制作基础知识-习题课件.ppt
  20. vhost dpdk 共享内存

热门文章

  1. APP-V与RemotoAPP
  2. WSUS部署中...
  3. 用ACE的Reactor模式实现网络通讯的例子
  4. 爬取微博好友所发微博制作词云
  5. sxssfworkbook设置单元格格式_用好条件格式,实现数据可视化,尤其是第8个技巧!...
  6. python中可变参数args_python 可变参数 *args, **kwds
  7. Html中的次方符号怎么写
  8. 解决内存不可read和written的问题
  9. 把软件放到图片里(超强)
  10. Android listView 去掉header和footer中的分割线