七年前開始接觸Java,那時候還是 SE 6版
碰了一年半後就沒機會再碰 Java
SE 7 釋出的時候有碰一點點 Android 程式
因為時間壓力也沒去學 7 版的東西
最近又要開始弄 Android 的東西
而且 Java 也都出到 SE 8版了
雖然 Android 最低相容到 SE 6
可是為了以後,還是把 SE 7 和 8 的空白補起來好
今天只先把語言的部分先看過
語言特徵上面真的增加蠻多新東西
一個上午看加上實驗,也不是很確定是不是已經抓住了
有些東西很簡單,有些東西概念比較複雜
也怕自己把實驗出來的東西忘了
這裡先把新增的語言特性 ( 不包含Java文件部分 ) 列舉
底下再說明文字常量表示法的一些改進
幾天內再慢慢補上其他特徵
- 二進位文字常量 ( Binary Liternal ), [ SE 7 ]
- Switch中的字串比較 [ SE 7 ]
- Try-with-resource 語句 [ SE 7 ]
- 多重例外 (Exception) 補捉與重拋機制改進 [ SE 7 ]
- 數字常量底線標示 [ SE 7 ]
- 泛型型別推測 [ SE 7, 8 ]
- Lambda 表示法 ( 匿名函式、函式介面 ) [ SE 8 ]
- 介面預設方法 ( Interface Default Method ) [ SE 8 ]
- 方法參數映射 ( Method Parameter Reflection ) [ SE 8 ]
二進位文字常量
對於寫電腦系統性質的程式來講
用到位元操作 ( bit-wise operation ) 的機會是很多的
有些開發人員,為了效率或者撰寫便利考量
一些旗標、狀態操作也會使用位元操作來表示
位元操作其實不算太難,問題就出在文字常量表示上面
C 語言以及 SE 6以前的 Java
只提供八進位表示、十進位表示、十六進位表示
單單就二進位表示不提供,這可能和電腦運作最小計量單位是 byte 有關
要作位元運算只能使用八進位或十六進位
可是相對於二進位的表示來說,八、十六進位還是不方便些
過去筆者當實驗板實習課的助教,常常有學生問
為什麼 0b0010,這樣的表示法編譯不會過
學生們一年級都學過 Verilog 硬體描述語言
並且沒什麼碰 C 語言,難免會覺得詫異
現在 Java 上終於已經支援這種語法表示
數字常量底線標示
一組數字,不管是要當位元組合也好
當作數量使用也好,或是作為其他特定用途數字表示也好
( 例如金額、電話、通行密碼等 )
一旦長了,閱讀的時候難免會看亂
SE 7 開始讓數字常量能夠加註底線
底線能夠加註在數字中的任何地方
注意:真的只有數字的中間,前端 (0x_12) 或尾端 ( 123_ ) 是不行的喔
例如作為行動電話用途的 0933123456,能夠寫成 0933_123_456
這樣看起來就清楚多了
又例如像位元組表示 0xFEFFAB12,能寫成 0xFE_FF_AB_12
這樣能夠精準的表示,一組 32-bit整數當中每一 byte的數值
Switch中的字串比較
一直以來 switch敘述句當中
只能去比較原始型別 ( primitive-type ) 的數值
但是現今廣泛的應用當中
switch當中作字串比較已經成為不可或缺的要素了
但是字串 (String) 因為是物件
並無法直接使用在 switch當中
而必須以 if ... else if ... else 的敘述
慢慢呼叫 String 的 equals 來比較字串
從 SE 7 開始 switch當中也擺入了字串比較
如此不需要撰寫冗長的 if ... else 敘述句
( 編譯後的程式碼也是有某種程度差異的 )
但是注意:Java 只有提供 switch敘述的簡易字串比較
一般比較字串還是得使用 .equals 來比較字串才行
== 或 != 運算子仍舊是行不通的
因為這在 Java當中,有比較物件是否為同一個的用途
不能隨便混淆
有人可能會反映,下面這樣比較出來的值都是一樣的
String s1 = "123456"; String s2 = "123456"; String s3 = "123" + "456"; System.out.println(s1 == s2); // true System.out.println(s1 == s3); // true
要稍微解釋一下
Java編譯出來的 byte code當中,有一個 constant pool 陣列區
專門用來存放文字常量、常數定義
以及 method signature定義這類常數值
為了編譯出來的檔案大小與運行效能考量
Java編譯器有能力去判斷文字常量是否相等
以及從語言層級 (編譯階段) 上就能判斷的簡易運算
例如加減法、字串合併等
因此範例中的 s1、s2,自然在編譯時就會指向 constant pool 的同一區
而 s3在經過簡易運算之後,也可以得到與 s1、s2相同的文字常量
自然從同一個文字常量產生的 String,是同一個物件
如果是下面的範例,就可以看出 == 與 != 運算子仍舊不可作字串內容比較
String s1 = "123456"; String s2 = new String(new char[] { '1', '2', '3', '4', '5', '6' }); System.out.println(s1 == s2);
留言列表