close

七年前開始接觸Java,那時候還是 SE 6版

碰了一年半後就沒機會再碰 Java

SE 7 釋出的時候有碰一點點 Android 程式

因為時間壓力也沒去學 7 版的東西

最近又要開始弄 Android 的東西

而且 Java 也都出到 SE 8版了

雖然 Android 最低相容到 SE 6

可是為了以後,還是把 SE 7 和 8 的空白補起來好

 

今天只先把語言的部分先看過

語言特徵上面真的增加蠻多新東西

一個上午看加上實驗,也不是很確定是不是已經抓住了

有些東西很簡單,有些東西概念比較複雜

也怕自己把實驗出來的東西忘了

這裡先把新增的語言特性 ( 不包含Java文件部分 ) 列舉

底下再說明文字常量表示法的一些改進

幾天內再慢慢補上其他特徵

 

二進位文字常量

對於寫電腦系統性質的程式來講

用到位元操作 ( 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);

 

arrow
arrow
    全站熱搜

    wylokgo101 發表在 痞客邦 留言(0) 人氣()