通用程序设计(七)

以下为我在《Effective Java》中留下的读书笔记,对一些重要的知识点提取出了摘要. 

45、将局部变量的作用域最小化

要使局部变量的作用域最小化,最有力的方法就是在第一次使用它的地方声明.

几乎每个局部变量都应该包含一个初始化表达式

避免在每次迭代中执行冗余计算的开销.如果可以保证在每次迭代中都返回同样的结果,就该使用这种做法.
for(int i=0,n=expensiveComputation(); i<n; i++){
}
另外,循环条件假如不是常量也需要格外注意.

46、for-each循环优先于传统的for循环

Iterable<E>接口

for-each循环在简洁性和预防Bug方面有着传统的for循环无法比拟的优势,并且没有性能损失.
有三种常见情况无法使用for-each

1、过滤(删除元素)
2、转换 (设定元素)
3、平行迭代

47、了解和使用类库

java.lang\java.util\java.io

Random、Math产生随机数的使用指南及缺陷.

集合框架、java.util.concurrent

补充:开发者社区

48、如果需要精确的答案,请避免使用float和double

float和double类型尤其不适合用于货币计算,因为要让一个float或者double精确地表示0.1(或者10的任何其他负数次方值)是不可能的.

需要精确的结果时,用BigDecimal或者int或long替代

如果数值范围没有超过9位十进制数字,就可以使用int,如果不超过18位数字,就可以使用long,否则就使用BigDecimal.

补充:几种二进制运算、BigDecimal的控制舍入

49、基本类型优先于装箱基本类型

基本类型与装箱类型的三个区别:    两个装箱基本类型可以具有相同的值和不同的同一性.   new Boolean("true") == new Boolean("true"); // false
                                                     装箱类型还有非功能值 null
                                                     基本类型通常比装箱类型更节省时间和空间

当在一项操作中混合使用基本类型和装箱基本类型时,装箱基本类型就会自动拆箱.如果null对象引用被自动拆箱,就会得到一个空指针异常.

当程序使用==操作符比较两个装箱基本类型时,做的是同一性比较

什么时候使用装箱基本类型?     作为集合中的元素、键和值
                                               在参数化类型中必须使用装箱基本类型
                                               在进行反射的方法调用时,必须使用装箱基本类型

50、如果其他类型更适合,则尽量避免使用字符串

字符串不适合代替其他的值类型
字符串不适合代替枚举类型
字符串不适合代替聚集类型
字符串也不适合代替能力表

51、当心字符串连接的性能

new StringBuilder(size)   append

52、通过接口引用对象

如果有合适的接口类型存在,那么对于参数、返回值、变量和域来说,就都应该使用接口类型进行声明.

如果没有合适的接口存在,完全可以用类而不是接口来引用对象.  例如,值类.String\BigInteger.

53、接口优先于反射机制

丧失了编译时类型检查的好处
执行反射访问所需要的代码笨拙冗长
性能损失

通常,普通应用程序在运行时不应该以反射方式访问对象.

一些需要反射机制的复杂应用程序:类浏览器、对象监视器、代码分析工具、解释型的内嵌式系统、RPC

如果适当的构造器不带参数,甚至根本不需要使用java.lang.reflect包;Class.newInstance方法就已经提供了所需的功能.

54、谨慎地使用本地化方法

本地方法提供了 
1、访问特定于平台的机制 的能力,比如 访问注册表、文件锁.
2、提供了访问遗留代码库的能力,从而可以访问遗留数据.
3、可以通过本地语言,编写应用程序中注重性能的部分

java.util.prefs注册表功能
java.awt.SystemTray访问桌面系统托盘区

使用本地方法的缺点:
1、使使用本地方法的应用程序也不再能免受内存毁坏错误的影响.
2、使用本地方法的应用程序也不再是可自由移植的.
3、使用本地方法的应用程序也更难调试.
4、在进入和退出本地代码时,需要相关的固定开销,所以,如果本地代码只是做少量的工作,本地方法可能降低性能.
5、需要“胶合代码”的本地方法编写起来单调乏味,难以阅读.

补充:遗留代码

55、谨慎地进行优化

好的API设计是优化的基础
每次试图做优化之前和之后要对性能进行测量

设计API、线路层协议和永久数据格式的时候,一定要考虑性能的因素.

补充:性能剖析工具

56、遵守普遍接受的命名惯例

类型参数名称 : T 任意类型 E 集合的元素类型 K和V 映射的键和值类型  X 表示异常
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值