看第二遍的过程中,总结了这些笔记。废话挺多,翻译也很一般,读起来略费劲。有些知识点实用性很低,或者比较初级,就略过了。个人认为此书不值豆瓣那高分。
代码见github仓库JavaSE中的cn.tl.effective包下,其中还有很多其他代码
第54条:返回零长度的数组或者集合,而不是 null
如果返回 null,那样会使 API 更难以使用,也更容易出错,而且没有任何性能优势
第57条:将局部变量的作用域最小化
在我们第一次需要它的地方进行声明,可读性和维护性更高
第57条:了解和使用类库(随机数)
- 并发编程时,Random 采取 CAS 操作,会造成很多线程自旋,导致性能下降。
- ThreadLocalRandom 每个线程都维护一个种子变量,不存在竞争,性能更高。
- 对于Fork Join Pool 和并行 Stream,则使用 SplittableRandom
第60条:如果需要精确的答案,请避免使用 float 和 double
在货币计算中,请使用 BigDecimal、int、long。
- 创建BigDecimal对象务必使用字符串的构造函数:BigDecimal(String val)。
- 使用int、long时,货币单位为分,自行处理小数点。
第63条:了解字符串连接的性能
在循环体里面禁止使用"+"连接符,详情请参考:Java字符串的“==”和“+”
第68条:遵守普遍接受的命名惯例
多看看 JDK、开源框架源码,学习其代码风格,是很重要的!
第79条:避免过度同步
过度同步可能导致性能降低、死锁,甚至不确定的行为。通常来说,在同步区域内做尽可能少的工作。
第80条:executor、task、stream 优先于线程
不要显式的创建线程,应该使用线程池。详情请参考:理解Java线程池ThreadPoolExecutor
第83条:慎用延迟初始化
在大多数情况下,正常的初始化要优先于延迟初始化。面试中比较典型的问题就是懒汉式的单例,详情请参考:[第3条:用私有构造器或者枚举类型强化 singleton 属性]