05.14 Java 編程細節——char 與 byte 相關知識點解析

作為java程序員,大家是不是發現自己很少用char,byte,更多的都是用String,StringBuffer,StringBuilder,那麼我們為什麼要研究char和byte呢?沒錯,就是空間,內存。。。


問:java char 能否存儲一個漢字,為什麼

答:char 類型一般默認佔用兩個字節,所以能存儲中文字符(一箇中文字符佔用兩個字節),所以 char c1 = '我'; 是合法的,而 char c2 = 'ab'; 是非法的,所以 char 類型在內存中佔用兩個字節空間,但是隻能表示一個字符,若是隻想表示一個字節的字符可以使用 byte。

問:下面程序段的輸出是什麼

Java 編程細節——char 與 byte 相關知識點解析

答:可能是 2、3、4 之一。因為 getBytes() 方法會根據當前默認的字符編碼格式獲取字節數組,gbk/gb2312 佔 2 位,utf-8 佔 3 位,unicode 佔 4 位。所以這個問題告誡大家寫代碼最好指定編碼,譬如可以通過 str.getBytes("GBK"),str.getBytes("UTF-8") 來指定輸出。

問:下面程序段的輸出是什麼

Java 編程細節——char 與 byte 相關知識點解析

答:輸出 c 和 100。

對於第一個輸出來說,char 在 java 中稱為字符型,佔 2 個字節,而字符常量是用單引號括起的一個字符,而且字符常量在內存中存儲的是該字符在 Unicode 字符集中的排序位置(即這裡的排序位置為 98,可以 javap 看),所以對於 char n = 'b' 來說就是 char n = 98,而 System.out.println(++n) 語句會先執行++n,所以為 99,然後輸出對應位置的字符,即 c。

對於第二個輸出來說,Java 中存在向上兼容的特點(不同類型數據參與運算數據類型會強制轉換,轉換的方向是 char -> short -> int -> long -> float -> double),所以在 System.out.println(n+1) 語句中,n 是 char 類型,1 是 int 類型,所以會先把 n 強轉成 int,然後運算 99 + 1,所以輸出也是 int 類型的 100。

Java 編程細節——char 與 byte 相關知識點解析

Java 編程細節——char 與 byte 相關知識點解析


分享到:


相關文章: