java Puzzler 读书笔记

1, 明确byte,char,short, int ,long ,double, float,boolean 基本类型的长度,取值范围(上下超范围溢出问题),精度,二进制表示方式; 该基本类

型在混合计算时,+,-,*,/,%,〈〈,〉〉等运算时的窄化,宽化位数处理,精度损失。+,==,!= 在基本类型特别是char类型与String混合运算时的重

载问题。
2,long 型的数据,在初始化时要明确结尾“L”符号,不得用小写“l”。
3,数值运算时溢出问题。
4,十六进制计算问题---字面常量,有符号数,与无符号数,互相转换问题要注意。


告诫:
1,应该尽量避免混合类型的计算
2,单个表达式中避免对同一个变量附值两次。
3,在条件表达式中使用类型相同的第二个和第三个操作数
4,不要将复合附值操作符作用于byte,short,char。尽量让操作符左右两侧的类型保持一致。尽量少用复合操作符,可以用X=X+1代替。复合敷值操作符别忘

了,还有>>>=, <<<=, <<=,>>=
5,Unicode 转义字符必须符合规范,即使是在注释中。尽量不要用Unicode 表示ascII字符。
6,每当byte序列转成String时,都要用到字符集,最好指定字符集。
7,在String操作时,特别是replace方法, 要注意是填写正则,还是普通字符串。
8,避免混合类型的比较。
9,避免对float,double类型做++,--,用double,float表示无穷大,是可以的。
10,NaN不等于任何浮点数,包括自己。Double.NaN
11,窄化基本类型转换可能会丢失级数的信息,或者是数值的精度。
12,Integer.Min_value 的负值是它自己,因为它没有对称的值。当对数值取负号的时候也要注意溢出问题。
13,精度丢失的三种拓宽基本类型转换(int -> float, long ->float, long-->double)的注意。不要使用浮点数做循环索引。
14,尽量使用double ,使用float 类型的情况是非常非常少的。
————————————————————————————————————————————
15,不要用return,break,continue或throw来退出finally语句块,千万不要让受检查的异常传播到finally语句块之外。
16,& 和 | 在连接boolean表达式时,不是按位与或,而是逻辑与或(重载了),且是不短路的检查。
17,捕获ERROR是完全不正常的行为。
——————————————————————————————————————————
18,静态方法及静态变量总要用类描述父,而不要用对象描述符,因为static是没有动态分派机制的。
19,不要覆盖静态类及方法,因为这样做是无任何意义的,并且容易引起混淆。也不要隐藏静态方法,因为是无意义的。
20,类的静态字段,块及方法的顺序是源代码编写顺序。要注意初始化的顺序。
21,instanceof 操作符左边值为null时返回false
22,实例的父子类循环初始化应该尽力避免,即子类调用父类初始化方法,在该方法内又调用子类方法,因为此时子类还没有初始化完毕,可能带来潜在的

顺序问题。不要在构造器中调用可以被覆盖的方法。积极初始化和延迟初始化。代价小就用积极初始化,代价大才用延迟初始化。
23,在一个final类型的字段被附值之前,存在着取用该值的可能,会默认一个值的。要注意。
24,构造器重载的时候,当调用构造器时,总是用最窄化的一个。
25,应该避免声明一个字段,一个静态方法,一个嵌套类型的名称与它的基类相对应的某个可访问字段,方法或类型相同。避免隐藏。
26,Date/Calendar 月份问题。
27,一个实现了序列化接口的单例,必须有一个私有的readResolve的方法,用于防止序列化时候创建另外的实例。
28, == 是不自反的(Double.NaN),也不是可传递的(拓宽基本类型转换)。

你可能感兴趣的:(java)