讀<<Java解惑>>後的碎嘴子(第六章)

第六章--庫問題
56.
BigInteger fiveThousand = new BigInteger("5000");
BigInteger fiftyThousand = new BigInteger("50000");
BigInteger fiveHundredThousand = new BigInteger("500000");
BigInteger total = BigInteger.ZERO;
total.add(fiveThousand);
total.add(fiftyThousand);
total.add(fiveHundredThousand);
System.out.println(total);

本章重點爲庫的API問題而不是語言本身問題,本條結果是0而不是550000,從另一個方面說明了API設計時命名的問題,add這個名字容易給使用者錯覺:會直接改變total引用的值,但是BigInteger是個不可變類(和String,BigDecimal和各種包裝器),需要用引用來接收返回值
總結:本條實際意義不大,在設計API時也要注意方法命名(語法本身方面),JDK庫設計本身也有很多不完美的地方(像Ruby這樣的好小夥子索性直接以歎號作爲方法結尾來代表其會直接改變引用值)

57.本條無需過多描述,大家都知道的
總結:override了equals方法就一定要連hashcode方法也一起覆蓋,不然別想用在基於hash的數據結構裏,詳情見<<Effective Java>>第三章

58.本條不注意看還真看不出來大師的例子是怎麼回事,原來是把equals的參數類型搞錯了
總結:很簡單,在要override的方法聲明上加入@Override的註解,避免一切override失誤,這在<<Effective Java>>中可是佔了專門一個席位

59.例子過程比較嚇人,後面的一堆解釋更嚇人,但是問題卻一眼就看出來了:int型中數字0開頭的是以八進制來計算的
總結:別在int前傻呵呵地亂加0

60.本條是很受歡迎的風格,通過使用API學習一些小技巧,內容見原書
總結:別忘了集合API中Linked家族集合(在原來Set或Map特性上保持了插入順序);1.4版本加入了正則表達式,使得一些類和基本所有的第三方正則庫光榮下崗;數組方面請關注java.util.Arrays類;5.0中各種基本類型包裝類新增了各種位操作方法

61.
Calendar cal = Calendar.getInstance();
cal.set(1999, 12, 31); 
System.out.print(cal.get(Calendar.YEAR) + " ");
Date d = cal.getTime();
System.out.println(d.getDay());

本條挺有應用實用性,介紹了JDK設計歷史上最杯具的java.util.Date類和連帶一起倒黴的java.util.Calendar類,結果打印2000 1,用過Calendar的人一下就明白了:月份是以0開頭的,1999年12月31日,參數應該是1999,11,31,這裏月份參數設爲12,並沒有選擇給出參數異常而是自動地上滾了年份,日期變成了2000年1月31日,而Date的getDay方法則是返回星期的序數(週日是0,週一是1,2000年1月31日是週一),這和方法名字明顯不是一個意思
總結:也沒什麼,用過一次就都知道怎麼回事了,Date和Calendar確實存在着很多問題

62.
Map<String, String> m = new IdentityHashMap<String, String>();
m.put("Mickey", "Mouse");
m.put("Mickey", "Mantle");
System.out.println(m);
打印結果是{Mickey=Mantle},看起來正確其實並不正確,因爲用的是IdentityHashMap,與HashMap的區別是判斷重複Key時,用的是引用等(==)而不是值等,碰巧String有常量性所以歪打正着
總結:沒什麼實際意義,可以順便學習一下IdentityHashMap

63.這條真的純沒用,真的

64.
public class Mod {
public static void main(String[ ] args) {
    final int MODULUS = 3;
    int[] histogram = new int[MODULUS];
    // Iterate over all ints (Idiom from Puzzle 26)
    int i = Integer.MIN_VALUE;
    do {
        histogram[Math.abs(i) % MODULUS]++;
    } while (i++ != Integer.MAX_VALUE);
    for (int j = 0; j < MODULUS; j++)
        System.out.println(histogram[j] + " ");
    }
}
這條要是不查任何東西直接回答結果是相當有難度的,不過根據以往經驗,Integer.MIN_VALUE,Integer.MAX_VALUE這樣的東西很有可能會搗亂,重點在於Math.abs(int i)方法,參數爲Integer.MIN_VALUE時會返回原值而不是絕對值
總結:本條其實是想提醒你多看javadoc文檔

65.作爲本章最後一條,例子很長,篇幅更長,意義還是如往常一樣簡單直接,這條和上一條bloch大師明顯玩的比較高興,嘮嘮叨叨了一大車
總結:Java裏沒有像ruby/perl那樣的超級宇宙航天飛船符號(<=>),你得自己在compareTo或compare方法裏自己明確返回-1,0或1
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章