2019独角兽企业重金招聘Python工程师标准>>>

解读:如果不需要每次都创建一个相同功能的新对象,最好重用对象,因为有时候反复创建同样的对象是有代价的。

例如:

1、String 的初始化我们一般不会调用String s = new Sring("fs"),如果用在循环中,则会找出不必要的浪费(每次都会在堆中new一段空间出来)。而对于String s="fs"这种方式,jdk有常量池概念,反复地调用则会被重用。

2、每次调用isBabyBoomer方法的时候都会做重复的动作,实例化两个对象:boomStart 和boomEnd,而这两个对象实际上每次调用都是一样重复的,因此完全可以只保存一份实例即可,因此比较合理的作法是定义成两个静态的成员变量,第一次加载类的时候实例化,后续不在实例化了。

不合理的写法:

public class Person {private final Date birthDate;public Person(Date birthDate) {// Defensive copy - see Item 39this.birthDate = new Date(birthDate.getTime());}// Other fields, methods omitted// DON'T DO THIS!public boolean isBabyBoomer() {// Unnecessary allocation of expensive objectCalendar gmtCal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));gmtCal.set(1946, Calendar.JANUARY, 1, 0, 0, 0);Date boomStart = gmtCal.getTime();gmtCal.set(1965, Calendar.JANUARY, 1, 0, 0, 0);Date boomEnd = gmtCal.getTime();return birthDate.compareTo(boomStart) >= 0&& birthDate.compareTo(boomEnd) < 0;}
}

改进的写法:

class Person {private final Date birthDate;public Person(Date birthDate) {// Defensive copy - see Item 39this.birthDate = new Date(birthDate.getTime());}// Other fields, methods/*** The starting and ending dates of the baby boom.*/private static final Date BOOM_START;private static final Date BOOM_END;static {Calendar gmtCal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));gmtCal.set(1946, Calendar.JANUARY, 1, 0, 0, 0);BOOM_START = gmtCal.getTime();gmtCal.set(1965, Calendar.JANUARY, 1, 0, 0, 0);BOOM_END = gmtCal.getTime();}public boolean isBabyBoomer() {return birthDate.compareTo(BOOM_START) >= 0&& birthDate.compareTo(BOOM_END) < 0;}
}

当然文中也提到了延迟初始化那两个日期对象的问题,也就是说在不调用isBabyBoomer方法的时候初始化这两个对象实际上意义不大(正如单例模式为什么懒加载的方法),但是作者并不推荐,这样会使方法变得更加复杂(这一点具体情况具体分析吧,也就是在性能的优化和复杂程度上如何做权衡了)。

3、文中讲的是适配器的形式。这一点没看懂,后面再仔细研究!

4、优先使用基本类型而不是装箱类型,要当心无意识的装箱。例如下面的一段代码,sum定以的类型是基本类型long的包装类Long,每加一次意味要实例化一次(和不提倡对String类型的字符串做反复的修改操作同样的道理,因为都是不可变类,必定造成堆空间的浪费),同时还有一次拆箱的操作。一次性能上是有一定的影响。因此尽量用基本类型。

public class Sum {// Hideously slow program! Can you spot the object creation?public static void main(String[] args) {Long sum = 0L;for (long i = 0; i < Integer.MAX_VALUE; i++) {sum += i;}System.out.println(sum);}
}

总结:适当情况下考虑对象的重用,避免创建不必要的对象,灵活运用,但不能一概而论!具体情况具体分析!

转载于:https://my.oschina.net/silence88/blog/827698

effective java读书笔记5:避免创建不必要的对象相关推荐

  1. Effective Java读书笔记三:创建和销毁对象

    第1条:考虑用静态工厂方法代替构造器 对于类而言,为了让客服端获得它的一个实例最常用的的一个方法就是提供一个公有的构造器.还有一种方法,类可以提供一个公有的静态工厂方法(static factory ...

  2. Effective Java读书笔记---二、创建和销毁对象

    二.创建和销毁对象 何时以及如何创建对象, 何时以及如何避免创建对象, 如何确保它们能够适时地销毁, 如何管理对象销毁之前必须进行的各种清理动作 1.用静态工厂方法代替构造器 优势: 它们有名称 不必 ...

  3. Effective Java读书笔记(二)

    Effective Java 读书笔记 (二) 创建和销毁对象 遇到多个构造器参数时要考虑使用构建器 创建和销毁对象 何时以及如何创建对象? 何时以及如何避免创建对象? 如何确保它们能够适时地销毁? ...

  4. Effective Java 读书笔记(七):通用程序设计

    Effective Java 读书笔记七通用程序设计 将局部变量的作用域最小化 for-each 循环优于传统的 for 循环 了解和使用类库 如果需要精确的答案请避免使用 float 和 doubl ...

  5. Effective Java 读书笔记(一)

    前言: 开个新的坑位,<effective java>的读书笔记,之后有时间会陆陆续续的更新,读这本书真的感触满多,item01和item02就已经在公司的项目代码中看到过了.今天这篇主要 ...

  6. Effective Java读书笔记完结啦

    Effective Java是一本经典的书, 很实用的Java进阶读物, 提供了各个方面的best practices. 最近终于做完了Effective Java的读书笔记, 发布出来与大家共享. ...

  7. Effective Java读书笔记七:泛型(部分章节需要重读)

    第23条:请不要在新代码中使用原生态类型 从java1.5发行版本开始,Java就提供了一种安全的替代方法,称作无限制的通配符类型,如果要使用范型,但是确定或者不关心实际的参数类型,就可以用一个问号代 ...

  8. Effective Java读书笔记六:方法

    第38条:检查参数的有效性 绝大多数方法和构造器对于传递给它们的参数值都会有些限制.比如,索引值必须大于等于0,且不能超过其最大值,对象不能为null等.这样就可以在导致错误的源头将错误捕获,从而避免 ...

  9. Effective Java读书笔记四:通用程序设计

    第45条:将局部变量的作用域最小化 在第一次使用变量时的地方声明: 几乎每个局部变量的声明都应该包含一个初始表达式: 如果在终止循环之后不需要循环变量的内容,for循环优于while循环.(for循环 ...

最新文章

  1. Mysql高级调优篇——第二章:Explain执行计划深度剖析
  2. 生成树协议,stp使用哪两个参数来选举根网桥?
  3. react 下拉选项自动滚动到可视区域
  4. 【经典】5种IO模型 | IO多路复用
  5. VS 2010 和 .NET 4.0 系列之《WPF 4》篇
  6. Idea打Jar包的坑,工程使用ali druid 等ali组件
  7. IFRAME自动适应的问题
  8. ubuntu ln软连接硬连接
  9. java中改变文本字体和大小_Java实训——编写一个窗体程序,可以对文本区中的文字设置字体和大小。...
  10. HDU 5857 Median(水~)
  11. 程序员也要学英语——名词和代词
  12. Creator动态获取,数据文,JSON并使用,枚举Enum,cc.sys.localStorage获取音效的判断 ,冒泡排序做排行榜 ,动态获取提示(cc.loader.loadRes),制作签到
  13. 微信视频号视频或直播预约二维码如何生成?
  14. 谷歌黑客搜索看这些就够了!
  15. 无限级树状图html5,无限树状列表的实现
  16. 目前UI设计和前端哪个行业更好?女生应该怎么抉择?
  17. 【Linux 系统运维基础】经典案例
  18. html5 手机相册裁剪,H5的手机图片裁剪特效
  19. 语义网笔记(二) RDF
  20. 一些opencv小工程(蓝白转换,进度条亮度对比度,鼠标位置读取rgb)

热门文章

  1. CRM成功实施如何化繁为简
  2. React学习手记5-细说组件state
  3. 前端自动化工具 grunt 插件 uglify 的简单使用(一)
  4. Learn Python 011: while loop
  5. 分布式id 实现方式
  6. boost之Boost.Foreach遍历
  7. DELL通过LCD简单的判别服务器的硬件故障
  8. 一步一步学linq to sql(四)查询句法
  9. Geoserver汉语版出来啦!!
  10. Artificial Intelligence Yourself