java对象重用_JAVA:避免重复的创建对象
在实际开发中,重复使用同一个对象要比每次需要的时候就创建一个对象要好的多;
作为一个比较极端的反面例子,看下面这个语句:
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:避免重复的创建对象相关推荐
- java 对象复活_Java对象复活
java 对象复活 总览 收集覆盖了finalize()的对象之后,将其添加到终结处理队列中,以在调用每个对象的finalize()方法之后进行清理. 如果您复活了物体,会发生什么? 何时定案? fi ...
- java 对象读写_java 对象输入输出流读写文件的操作实例
java 对象输入输出流读写文件的操作实例 java 支持对对象的读写操作,所操作的对象必须实现Serializable接口. 实例代码: package vo; import java.io.Ser ...
- java 对象结构_java对象的结构
在Hotspot JVM中,32位机器下,Integer对象的大小是int的几倍? 我们都知道在Java语言规范已经规定了int的大小是4个字节,那么Integer对象的大小是多少呢? 要知道一个对象 ...
- java 对象深拷贝_java深入理解浅拷贝和深拷贝
简介 拷贝对象是java中经常会遇到的问题.java中存在两种类型,基础类型和引用类型. java的赋值都是传值的,对于基础类型来说,会拷贝具体的内容,但是对于引用对象来说,存储的这个值只是指向实际对 ...
- java对象复制_Java对象的深层复制与浅层复制
TestVO a = new TestVO(); a.setName("xiemingmei"); a.setBirthPlace("Hunan"); Test ...
- java 对象乱码_java对象乱码怎么办
java对象乱码怎么办,乱码,方式,数据库,要用,解决办法 java对象乱码怎么办 易采站长站,站长之家为您整理了java对象乱码怎么办的相关内容. java对象乱码的解决办法:1.文件下载乱码时,下 ...
- java 对象工厂_Java设计模式之--工厂方式
在分析工厂模式之前,我们先看看普通模式下的Java三层结构. Controller(表现层)-Service(业务层)-Dao(持久层.数据库连接层),基于此三层结构完成JavaWeb相关业务. 假设 ...
- java 对象 方法_java——类、对象、方法
一.类 1.Java语言把一组对象中相同属性和方法抽象到一个Java源文件就形成了类. 一个java文件可以有多个类,但是每一个类都会生成一个class字节码文件. 如果class 前加public ...
- java 对象初始化_Java对象初始化
自动初始化(默认值) 一个类的所有基本数据成员都会得到初始化,运行下面的例子可以查看这些默认值: classDefault{booleant;charc;byteb;shorts;inti;longl ...
最新文章
- Makefile —— Makefile的规则是什么?make是如何工作的?make的工作方式是什么?
- 爱上MVC~为DisplayNameFor添加扩展,支持PagedList集合
- python六十五:描述符(__get__, __set__, __delete__)
- android 解决setbackgrounddrawable过时
- 你最喜欢哪款游戏的界面风格,为什么?
- 祭奠被遗忘的冒泡排序
- Zookeeper之事件监听机制
- DXperience 7.1.1
- somachine3.1安装
- Linux中设置Java程序开机自动运行
- TR069协议与商业应用6——TR069动态库开发
- PHP面试技巧 之 职场暗语知多少?!
- gopher对mysql的利用_gopher协议的攻击利用
- 分布式环境下限流方案的实现
- python arp断网攻击_ARP断网攻击的原理与解决方法讲解 | 小马激活官网
- excel怎么一个格子斜分_excel如何在单元格里加上斜线分割内容
- 论文学习笔记:通用对抗扰动UAP
- C语言实验——某年某月的天数
- 制作一个html文件 效果如下图,网页制作基础知识-习题课件.ppt
- vhost dpdk 共享内存
热门文章
- APP-V与RemotoAPP
- WSUS部署中...
- 用ACE的Reactor模式实现网络通讯的例子
- 爬取微博好友所发微博制作词云
- sxssfworkbook设置单元格格式_用好条件格式,实现数据可视化,尤其是第8个技巧!...
- python中可变参数args_python 可变参数 *args, **kwds
- Html中的次方符号怎么写
- 解决内存不可read和written的问题
- 把软件放到图片里(超强)
- Android listView 去掉header和footer中的分割线