第45条 将局部变量的作用与最小化
要是局部变量的作用与最小化,最有力的方法就是在第一次使用它的地方声明。
for循环优于while循环,for循环定义的变量作用与仅限于循环内,while需要初始化变量
对局部变量作用域最小化的循环做法:
1 | for( int i = 0 , n= computeSize(); i<n; i++){ |
第46条 for-each循环优于传统for循环
使用for-each循环不会有性能损失,对于数组也一样
三种情况不适用for-each:
- 过滤集合元素
- 改变集合元素
- 平行迭代,如集合a,b,每次迭代顺序取得a,b第n个元素
第47条 了解使用类库
熟悉java.lang, java.utils, java.io
如果需要精确答案,避免使用float和double
float和double是为了在广泛的数值上提供较为精确结果的场合设计的, 不能提供完全精确的结果,尤其不适合货币计算
如果计算小数,使用bigdecimal,但是使用繁琐、性能较差;若对性能有要求,可以改变单位使用int或者long。
第49条 基本类型优于装箱基本类型
对装箱基本类型运用==操作符几乎总是错误的
装箱基本类型导致高开销和不必要的对象创建
第50条 如果其他类型更合适,避免使用字符串
金科玉律,在做工作时能明显感受到字符串操作造成的性能影响
- 字符串不适合代替其他类型
- 字符串不适合代替聚集类型,如String key = className + “#” + i.next();
- 字符串不适合代替能力表(unforgeable key, 也被叫做能力表capability)
第51条 当心字符串链接的性能
不要使用“+”连接字符串,使用StringBuilder
第52条 使用接口引用对象
如果有合适的接口类型存在,那么对于参数、返回值、变量和域来说,都应该使用接口类型声明。
第53条 接口优先于反射机制
反射缺点:
- 无法进行编译时类型检查(checked exception),包括异常检查
- 实现反射功能的代码复杂(是否考虑实现内部反射模块,降低反射代码编写成本)
- 性能损失
第54条 谨慎的使用本地方法
尽量少使用JNI方法,弊端如下:
- 本地语言不安全,可能受到内存损坏错误影响
- 本地语言与平台相关,使程序不可跨平台执行
- 程序难以调试
- 如果功能简单,本地语言会使性能下降
- 程序阅读性变差
第55条 谨慎地进行优化
不要因为性能牺牲合理的结构。
- 在设计过程中,应避免那些限制性能的设计决策。
- 要考虑API设计决策的性能后果。公有类如果可变,会造成大量保护性拷贝。
第56条 遵守普遍接受的命名惯例
- 包的名称应该是层次状的,用句号分割每部分。其名称以你的组织的internet域名开头,且顶级域名放在前面。
- 包名称的其他部分应该包括一个或多个描述该包的组成部分,通常不超过8个字符
- 类和接口的名称首字母大写,尽量避免使用缩写,除非是通用缩写。类名通常用一个名词或名词短语命名。
- 方法和域名与类和接口命名方式一样,只不过首字母要小写。方法通常用动词短语命名,对于返回boolean类型的方法,往往以is开头;类型转换通常被命名为toType;返回视图往往被命名为asType。
- 常量域包含一个或多个大写的单词,中间用下划线隔开,这是唯一推荐使用下划线的场景