第2章
判断是否是奇数 i % 2 == 1; <- 错误的
当 i 是负数的时候,明显不能正确。 可以换成和0判断。 i % 2 == 0 ; 就可以避免。
更加优的性能: (i & 1) != 0;
Double 相减不一定出现想要的结果, 因此需要精密答案的地方要避免使用 float, double 。 而用 int , long , BigDecimal
例如 : new BigDecimal("2.00").subtract(new BigDecimal("1.10")) 结果为 0.90
2.00 - 1.10 结果为 0.8999999999999999
BigDecimal(String) 不可用 BigDecimal (Double ) 代替,否则 不精确。
char x = 'X';
int i = 0;
System.out.println(true ? x : 0);
System.out.println(false ? i : x); 输出结果为 X88 , 原因是 X 强制转换成为 int 型。
+= 类似的为符合赋值表达式, 自动地将说执行计算的结果转型为其左侧变量的类型。 不同与 a + b = c .
Object x = "buy";
String i = "Effective Java ! ";
x = x + i; √ (x + i 是 String型的, Sting 与 Object 兼容)
x += i; ×
注意 replace() 和 replaceAll() 的区别 : 链接
不能用return , break, continue 或者 throw 来退出 finally 语句块,并且千万不要允许让受检查的异常传播到finally 语句块之外。
通过覆写,可以获得动态的分派;而通过隐藏,你却得不到这种特性。(继承static 的函数,其实是隐藏-谜题48)
只要你覆写了equals方法,你就必须同时覆写hashcode
hashset类是使用equals(object)方法来测试元素是否等性,申明时注意是覆写而不是重载。
(@override 防止误写)
用String.split 代替String.Tokenizer ,因为前者可以用正则表达式,更加敏捷。
Date 将1月用0表示,而Calender 延续了这个错误,用Calendear.December 来表示明显而正确。
final 修饰符对方法和域而言,意味着完全不同的事情,
方法: 不能被覆写或者隐藏
域: 不能被赋值超过一次