Effective Java笔记--第8章

第8章


第45条:将局部变量的作用域控制在最小

1. 最有效的方法:第一次使用此局部变量的地方声明。[越晚声明越好][降低代码出错的可能性]

2. 声明同时:进行有意义的初始化

3. 2的例外:try-catch,局部变量的初始化可能是无意义的

4. 一般情况下:for循环优于while循环[for更短][while循环可能扩大局部变量的作用域,使得代码更容易出错]


第46条:for-each循环优于传统的for循环

参考[遍历collection]:点击打开链接 

[for-each使用例子,访问多维数组]:点击打开链接 

1. 性能上:for-each和for一样,某些情况下,for-each效率还稍微高一点

2. 优点:for-each提高代码可读性,写起来也不容易出错。尤其:多个集合嵌套迭代时候,太容易出错了,比如:访问Collection的时候,Iterator调用next()

3. 缺点:for-each只能用于读取,不能用于写。因为没有显式获取数组,Collection的index


第47条:了解和使用类库

1. 类库都是专家写的,类库会持续更新,性能会不断提升,会不断添加接口,会有大神不断的维护,基本上没有bug。类库的代码一般比自己写的好

2. 大家都在用,使得自己的代码融入主流

3. 应该保持:自己熟悉最新的类库同步

4. 应该熟悉的类库:java.lang   java.util   java.io   java.util.concurrent(并发库)

5. 不要重新发明轮子。遇到需求,先查查是否有可用的类库,实在没有的话,再考虑自己写


第48条:如果需要精确的答案,应避免使用float,double

1.  java计算:1.03-0.42=0.6100000000000001

2. float和double没有提供完全精确的计算,尤其不适合货币计算

3. 代替方案:用int,long[使用最小单位],BigDecimal计算

4. BigDecimal两个缺点:性能差一些,使用不方便


第49条:基本类型优于“装箱基本类型”

1. 基本类型(primitive)都有对应的引用类型(reference type),叫做:装箱基本类型(boxed primitive)


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




第51条:注意字符串连接性能

1. 字符串拼接时候,StringBuilder性能秒杀String。推荐用 StringBuilder的append()

2. StringBuilder不是线程安全的,StringBuffer是线程安全的

3. 字符串拼接,String开销为 O(n*n),StringBuilder开销是 O(n)。数目越大,性能差距越大

4. 其他解决办法:使用字符串数组,每次只处理一个,而不是将它们组合起来

5. 参考下面的代码:result = result + i; 性能很差


第52条:通过接口/父类 引用对象,可以让程序更灵活[面向接口/父类编程的思想]

1. 对于方法的参数,返回值,变量和域,都应该尽量使用接口进行声明。这样子,程序会更灵活:改变接口的具体实现类,并不需要修改程序的其他地方(可以顺利编译)。

2. List<Object> list = new ArrayList<Object>()  要优于 ArrayList<Object> list = new ArrayList<Object>() 。ps:我记得性能上似乎略为差一点??

3. list如果使用了ArrayList的方法或者属性,则不行!

4. 改变接口的实现类的原因:新的实现类,性能更好,或者提供了额外的功能(如:线程安全)

5. To-Do:ThreadLocal类?

6. To-Do:接口和抽象类之间的区别

7. 没有合适的接口可用,则只能用类引用对象:有些类可能没有合适的接口,1.值类:String,Integer ;2.已经属于某些框架的类[框架的基本类型是类,不是接口]

8. 值类很少有多个实现,而且通常是final,很少有对应的接口

9. 总结:有没有合适的接口,很明显。没有就没得选择,乖乖用类吧


第53条:


第54条:谨慎提示用本地方法

1. 本地方法:指用本地程序设计语言(比如:C/C++)编写的特殊方法

2. 本地方法的用途(历史原因):1. 访问特定平台,如访问注册表,文件锁    2. 访问遗留代码库,以前的C/C++的代码库,如FFMPEG  3. 提高性能  4. 关键代码的加密,如用在 android

3. 现在:用本地方法提高性能,不值得提倡[1. Java有很多类库可用,比如:访问注册表    2. VM优化越来越好]

4. 本地方法缺点:不易调试,可读性差,本地语言不是安全的,移植性降低,进入/退出本地方法的时候,是需要一定开销的


第55条:谨慎的进行优化

1. 优化弊大于利,尽量不要进行优化,尤其是不成熟的优化,不成熟的优化可能导致诸多问题

2. 程序结构的合理性,比性能更重要

3. 努力编写好的程序,而不是快的程序

4. 好的程序体现了:信息隐藏,模块化。修改某个模块,不会影响到系统的其他部分。后期优化的话,也方便

5. 性能的考虑:越早越好。设计之初就考虑。后期再优化的话,会修改系统的结构,使得结构变的不好

6. 注意系统性能的瓶颈:一般是:IO,

7. 优化的顺序:1. 算法  2. API,线路层协议,永久数据格式  3.

8. java代码和CPU执行的代码之间存在:语言沟。流传的性能优化的方法,半真半假


总结:1. 努力写好的程序,速度自然会随之而来。 2. 设计:API,线路层协议,永久数据格式的时候(json比xml快),一定要考虑性能。 3.可以借助性能解析工具,找到性能瓶颈(方法的调用次数,执行的时间等)  4. 优化做完后,最好测试一下,是否速度更快了  5. 算法的优化是效果最明显的





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值