目录
Item 57: Minimize the scope of local variables
Item 58: Prefer for-each loops to traditional for loops
Item 59: Know and use the libraries
Item 60: Avoid float and double if exact answers are required
Item 61: Prefer primitive types to boxed primitives
Item 62: Avoid strings where other types are more appropriate
Item 63: Beware the performance of string concatenation
Item 64: Refer to objects by their interfaces
Item 65: Prefer interfaces to reflection
Item 66: Use native methods judiciously
Item 68: Adhere to generally accepted naming conventions
Item 57: Minimize the scope of local variables
将局部变量的作用域最小化
Item 58: Prefer for-each loops to traditional for loops
for-each循环优先于传统的for循环
相比传统for循环,for-each循环在简洁性、灵活性、bug预防性等方面有绝对优势,且没有性能降低问题。
Item 59: Know and use the libraries
了解和使用类库
不要重复造轮子。善于使用现有类库并非是编程能力差的表现。
Item 60: Avoid float and double if exact answers are required
如果需要精确的答案,请避免使用floatanddouble
在精确答案的计算任务中,可用BigDecimal代替。
如果介意性能损耗,且不介意自己处理小数部分、涉及数值不大,可使用int(没超过9位数字)或long(没超过18位),否则必须使用BigDecimal。
Item 61: Prefer primitive types to boxed primitives
基本类型优先于装箱基本类型
基本类型更简单、快速。
当基本类型和装箱基本类型混合计算时,程序会进行拆箱操作,这时可能抛出NullPointerException。
Item 62: Avoid strings where other types are more appropriate
如果其他类型更合适,则尽量避免使用字符串
string类型更加笨拙、不灵活、速度慢、容易出错。
当数据是非字符串时,优先采用或者设计新的类来替代字符串。
Item 63: Beware the performance of string concatenation
注意字符串连接的性能
字符串连接符(+)适用于较小的、大小固定的字符串拼接。重复连接n个字符串的需要消耗n的平方级的时间。
// 不推荐做法
String result = "";
for (int i=0; i< numItems(); i++)
result += lineForItem(i);
需要拼接大量且较大的字符串时,应使用StringBuilder代替,时耗线性增加。或者用字符串数组。
Item 64: Refer to objects by their interfaces
通过接口引用对象
如果有合适的接口类型存在,那么对于参数、返回值、变量、域都应该使用接口类型,而不是类。
如果没有合适的接口类型,那么尽可能使用最上层的基(父)类。
好处:更灵活,代码需要替换具体实现时,可以让周围代码无感知。
Item 65: Prefer interfaces to reflection
接口优先于反射机制
反射应用场合:创建和访问运行时可能不存在的类、方法、域。
反射的弊端:不能编译时进行类型检查、代码繁琐且难读、性能损失。
如果程序必须和编译时未知的类一起工作,如果有可能,就应该仅仅使用反射机制来实例化对象,使用接口类型或超类来访问对象。
Item 66: Use native methods judiciously
谨慎地使用本地方法
术语
- JNI:Java Native Interface
- native methods: 本地方法,用本地编程语言(如c\c++)编写的方方。本地语言是和平台相关的。
本地方法主要有3种用途(但都很少这么做):
- 访问特定于平台(platform-specific)的设施,如注册表。
- 访问现有的本地代码库。
- 编写应用程序中注重性能的部分。
本地方法弊端:
- 本地语言是不安全的,本地方法不能免受内存毁坏错误的影响。
- 本地方法的应用程序难以debug。
- 使用不当还会降低性能。因为垃圾回收器不是自动的,无法追踪本地内存使用情况,且进入和退出本地代码时需要额外开销。
如果不可避免要使用本地方法,则尽可能少用,且进行全面测试。
Item 67: Optimize judiciously
谨慎地进行优化
考虑API设计决策的性能后果,避免限制性能的设计决策。
精心设计程序,有了清晰、简明、良好的结构,速度自然会提升。如果还不行,再考虑优化。
每次试图优化前后,要对性能进行测量。
有个常识:程序把90%的时间花在10%的代码上。
要借助性能剖析工具(profiling tool)来分析性能问题。
推荐一个非性能剖析工具jmh。
java有以下问题:
- 没有很强的性能模型:各种基本操作的相对开销没有明确定义。
- 性能在不同的jvm实现、发行版本、处理器间会有差异。
Item 68: Adhere to generally accepted naming conventions
遵守普遍接受的命名惯例