Item 45 局部变量作用域最小化
局部变量的定义,应该在第一次使用它的地方声明,而不总是在代码的开头
Item 46 for-each循环优先使用
JDK1.5后引入for-each循环,完全隐藏了迭代器/索引变量,避免了混乱和出错的可能
for-each优势:
- 简洁
- 预防bug
- 性能也不差
以下情况无法使用:
- 遍历集合对某个元素操作时(主要是想利用迭代器的方法)
- 并行遍历:同时推进遍历多个集合时
Item 47 了解/使用 类库
使用标准类库好处:
- 正确
- 不用浪费时间在底层细节上
- 性能会自主逐渐提高
- 让自己的代码更主流
Item 48 避免使用float/double
Float与double类型特别不适合于货币计算,因为不可能用float或double精确的表示0.1(及任何10的负幂次方的数)。
Item 49 基本类型 优于 装箱基本类型
Java类型系统:基本类型+引用类型
每个基本类型对应的引用类型 => 装箱基本类型
基本类型VS装箱基本类型区别:
- 基本类型只有值
- 基本类型只有功能完备的值,而装箱基本类型还有哥非功能值:null
- 基本类型更节省时间和空间
使用情况:
- 作为集合的元素、键、值
- 参数化类型
- 反射的方法调用
Item 50 尽量避免使用字符串
- 字符串不适合代替数值等其它类型
- 字符串不适合代替枚举类型
- 字符串不适合代替聚集类型
Item 51 当心 字符串连接 的性能
连接n个字符串而重复使用连接操作时,需要n的平方级时间
连接时的拷贝操作也是消耗性能的
建议使用StringBuilder.append方法
Item 52 通过接口引用对象
通过接口来引用对象
Object obj = new A();
没有合适接口情况:
- 完全可以用类而不是接口来引用对象时,比如值类型
- 对象属于一个框架,而框架基本类型是类,不是接口
- 类实现了接口,但它提供了接口中不存在的额外方法
Item 53 接口优先于反射
反射代价:
- 丧失了编译时类型检查的好处
- 执行反射访问所需要的代码非常笨拙和冗长
- 性能损失
有些程序,必须用到编译时无法获取的类,通过适当的接口或者超类引用这个类,示例:
Item 54 谨慎使用本地方法
JNI,有三种用途:
- 提供了平台相关的访问能力
- 提供了访问遗留代码库的能力,从而访问遗留数据
- 通过本地语言,编写应用程序中注重性能部分(不过随着VM性能提高,现在越来越没有必要性)
JNI缺点:
- 不安全
- 平台相关后,影响移植性
- 更难调试
- 进入/退出本地代码需要固定开销
- “胶合代码”的本地方法编写起来单调乏味,难以阅读
Item 55 谨慎本地化
不要因性能而牺牲合理的结构,要编写好的程序而不是快的程序
关键是,要找出程序把时间花在哪些地方并不容易 => 性能剖析
Item 56 命名要普通可接受