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

第二章--字符問題

11.
System.out.println('h' + 'a');
  結果是201,這一點都不奇怪了,只有字符串之間的加號纔是字符串連接操作,char只不過是無符號整數而已,會被自動擴展成32位的int計算
總結:可以深入研究java基本類型擴展和窄化的規則來了解更多的真相

12.
char[] array = {'a','b','c'};
System.out.println("1" + array);

   結果並不是"1abc",array調用了原始Object的toString(),因爲字符串連接符號會先計算左右各自的輸出,然後再拼接
總結:System.out.println(char[] array),String.valueOf(char[] array)等一系列這類方法,能夠打印出裏面元素因爲方法內部有特殊處理

13.
String pig = "1";
String dog = String.valueOf(pig.length());
System.out.println("equals??? " + pig==dog);

結果輸出爲false,都知道String不可改變,還有一個字符池的特性,pig==dog爲false這個結果並不奇怪,但是有意思的是,equals???這個輸出卻沒了,因爲是字符串連接優先級比==要高,因此內部變成了equals???1==1,這個false可是會欺騙人的
總結:比較字符串用equals方法,用==時注意優先級

14.
System.out.println("a\u0022.length() + \u0022b".length());
結果是2,這個有點老,因爲所有unicode都會被編譯第一時間轉換
總結:這個應該都知道的

15.有了IDE這已經不是個事了
總結:用IDE

16.和14基本是一個意思
總結:這個死不了人

17.這條是混事的

18.源碼太多免了,重點在於String(byte[] bytes)構造方法的特性,他的length()不一定等於bytes.length,沒有顯式聲明編碼字符集會使用平臺默認的,這只是字符集的衆多問題之一
總結:用byte數組構造String,儘量用String(byte[] bytes, String charset)版本,來顯式指定要使用的字符集

19.和14,15,16一個意思,有了IDE基本就沒這個問題了

20.乍一看開頭就納悶怎麼從字符跳到了反射的問題上,然後就被忽悠了,這個用過正則的人都知道了
總結:轉義轉義轉義

21.
System.out.println("a".replaceAll("a", java.io.File.separator));
都知道目錄分隔符要用這個File常量來跨平臺,但是這裏在windows運行會越界異常,因爲生成的“\”,會被當成轉義符號
總結:類庫方法帶正則的要多加小心

22.剛看的時候嚇了一跳,仔細一看原來是與break,continue配合的label
總結:可以用來嚇唬人,貌似很多人都不知道label:標行這個功能

23.掃了一眼例子本以爲是本章壓軸大戲,原來是大師給你的三條忠告:注意隨機數取值範圍;switch別忘了break;StringBuffer沒有StringBuffer(char c)這個構造方法
總結:bloch大師本章不給力啊
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章