通用程序设计(七)

原创 2015年07月07日 09:01:58
以下为我在《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 表示异常
版权声明:本文为博主原创文章,未经博主允许不得转载。

EffectiveJava(笔记七) 通用程序设计

45. 将局部变量的作用域最小化将局部变量的作用最小化, 可以增强代码的可读性和可维护性, 并降低出错的可能性 要使局部变量的作用域最小化, 最有力的方法就是在第一次使用它的地方声明 几乎每个局部变量...

【effective java读书笔记】通用程序设计(一)

从小,我这人读书有个毛病,就是喜欢虎头蛇尾。小说什么的,一直如此。改变这种情况,唯有坚持,才能改变。 一、第45条,将局部变量的作用域最小化: 二、第46条,for-each循环优先于传统的for循环...

EffectiveJava-通用程序设计

/* * 45 将局部变量的作用域最小化 * 局部变量的作用从它被声明的点开始,一直到外围块(block)的结束处。 * 几乎每个局部变量的声明都应该包含一个初始化表达式。 * * 46 ...

6、通用程序设计

兴趣遍地都是,专注和持之以恒才是真正稀缺的。

Effective Java 之通用程序设计

1 通用程序设计1.1 优先使用 for-each 代替for循环 for-each性能并不比for差,有时稍有性能优势 for-each可以减少出Bug的几率 for-each比f...

EffectiveJava第八章:通用程序设计

讨论Java语言的具体细节,讨论了局部变量的处理、控制结构、类库的用法、各种数据类型的用法,反射(reflection)和本地方法(native method)的用法。45. 将局部变量的作用域最小化...

effective java:通用程序设计

45条:将局部变量的作用域最小化          1:局部变量的作用域从它被声明的点开始,一直到外围块(block)结束。如果变量在被使用块之前被声明,当程序退出该块时,该变量仍然可见。      ...

【effective Java读书笔记】通用程序设计(三)

第50条 如果其他类型更合适则尽量避免使用字符串 第51条 当心字符串连接的性能 第52条 通过接口使用对象 第53条接口优先于反射机制 第54条谨慎的使用本地方法 第55条谨慎的进行优化 第56条遵...

[Effective Java]第八章 通用程序设计

第八章 通用程序设计45、 将局部变量的作用域最小化将局部变量的作用域最小化,可以增强代码的可读性和可维护性,并降低出错的可能性。要使用局部变量的作用域最小化,最有力的方法就是在第一次使用它的地方才声...

Java通用程序设计与集合方法总结

一.  equals() VS “==”     equals() 通常用来比较两个引用所指向的对象的内容是否相等;而 “==”通常比较的事两个引用所指向的对象是否为同一个对象,即是否引用了同一个内存...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:通用程序设计(七)
举报原因:
原因补充:

(最多只允许输入30个字)