char 類型學(xué)習(xí)

定義

甲骨文官方對于原始數(shù)據(jù)類型 char 定義:

char: The char data type is a single 16-bit Unicode character. It has a minimum value of '\u0000' (or 0) and a maximum value of '\uffff' (or 65,535 inclusive).

可以知道主要以下三點:

  1. char 類型是原始類型
  2. Unicode 字符 (額外補充, 采用 UTF-16 的編碼形式)
  3. 16 bit 即 2 個字節(jié)表示一個字符

初始化

因為 char 是16位2字節(jié)的, 采取的 Unicode UTF-16 的編碼方式, 所以 char 就有以下的初始化方式:

// 直接字符或漢字
char c = '帥'; 

// 可以用整數(shù)賦值
char c = 十進制數(shù)隧魄,八進制數(shù),十六進制數(shù)等等;

// 使用字符的編碼值來初始化
char c = '\u數(shù)字';

// 特殊默認值, 參考后續(xù)筆記
char c;

注意, 必須用單引號, 且只能放單個字符.

特殊默認值

官方默認值表格:

Data Type Default Value
byte 0
short 0
int 0
long 0L
float 0.0f
double 0.0d
char '\u0000'
String (or any object) null
boolean false

我們可以看到 char 的默認值為 \u0000, 4位16進制. 根據(jù) UTF-16 的編碼格式, 我們可以將其轉(zhuǎn)換成 unicode 0000 0000, 代表空字符 NUL.

但這里的空字符 NUL 和實際代碼中的 null 是不一樣的. 實際上不是一個可打印字符. 僅代表Unicode編碼中的空字符. 也不是空格, 因為真正的空格的編碼是 '\u0020'.

參考示例代碼 (例子來自于你所不知道的Java之char默認值):

public class PrimitiveType {

    char c; // 使用默認值

    @Test
    public void testChar() {
        PrimitiveType t = new PrimitiveType();
        char c1 = '\u0000'; // 指定默認值
        char c2 = '\0';
        char c3 = '\u2400'; // 對應(yīng)字符 NUL
        char c4 = '\u0020'; // 對應(yīng)字符 空格
        System.out.println("c1: " + c1);
        System.out.println("c2: " + c2);
        System.out.println("c3: " + c3);
        System.out.println("c4: " + c4);
        System.out.println("c: " + c);
        System.out.println("c1==c: " + (c1 == t.c));
        System.out.println("c1==c2: " + (c1 == c2));
        System.out.println("c1==c3: " + (c1 == c3));
        System.out.println("c1==c4: " + (c1 == c4));
    }
}

輸出:

c1:
c2:
c3: NUL
c4:
c:
c1==c: true
c1==c2: true
c1==c3: false
c1==c4: false

運算

char 類型是可以運算的, 因為字符在編碼表中有對應(yīng)的數(shù)值. (數(shù)字取值范圍是0~65535)

char m = 'a';       // 輸出 a

char m = 'a' + 'b'; // char 類型相加, 提升為 int 類型相加 97 + 98, 相加后為 195, 然后輸出對應(yīng)的字符.
int m = 'a' + 'b'; // 輸出 195.

char m = 'a' + b;   // 報錯, 因為b是一個賦值的變量

char m = 195;     // 輸出字符編碼表中對應(yīng)的字符
char m = '195';   // 報錯, 因為有單引號, 表示字符, 只允許放單個字符

char m = 'a' + 1;  // 輸出 b, 提升為 int 類型相加, 計算結(jié)果 98 對應(yīng)的字符是b

char m ='中'+'國'+'國'+'國'; // 報錯. 計算結(jié)果 86820 超出范圍 65535
int m ='中'+'國'+'國'+'國'; // 輸出 86820

System.out.println('中'+"國"); // 輸出中國. String與任何字符用 + 相連, 轉(zhuǎn)換為String
char m ='中'+"國"; // 報錯. String 無法轉(zhuǎn)換為 char.

總結(jié), char + char 與 char + int 類型均提升為 int, 附值char變量后, 輸出字符編碼表中對應(yīng)的字符.

問題收集

題目收集整理自Java char 與 byte

java char 能否存儲一個漢字?

java char 類型采用 Unicode 字符集, UTF-16 的編碼方式. 當(dāng)然可以儲存一個漢字. 在 Unicode 中一個中文漢字占用兩個字節(jié).

若是只想表示一個字節(jié)的字符可以使用 byte 類型.

程序A的輸出

String str = "我";
byte[] c1 = str.getBytes();
System.out.println(c1.length);

可能是 2、3顽悼、4 之一. 因為 getBytes() 方法會根據(jù)當(dāng)前默認的字符編碼格式獲取字節(jié)數(shù)組, gbk/gb2312 占 2 位, utf-8 占 3 位, utf-16 占 4 位, unicode 占 4 位. 所以寫代碼時最好指定編碼几迄,可以通過 str.getBytes("GBK")str.getBytes("UTF-8") 來指定編碼方式.

可以通過在線轉(zhuǎn)換去快速查詢 - 網(wǎng)址

程序B的輸出

char n = 'b';
System.out.println(++n);
System.out.println(n+1);

輸出 c 和 100. 第二個輸出多了類型轉(zhuǎn)換.

字符 b 在 unicode 中十進制對應(yīng) 98, 而 System.out.println(++n) 語句會先執(zhí)行 ++n,所以為 99木羹,然后輸出對應(yīng)的字符, 即 c.

對于第二個輸出來說, Java 中存在向上兼容的特點(不同類型數(shù)據(jù)參與運算數(shù)據(jù)類型會強制轉(zhuǎn)換解孙,轉(zhuǎn)換的方向是 char -> short -> int -> long -> float -> double), 所以在 System.out.println(n+1) 語句中,n 是 char 類型弛姜,1 是 int 類型,所以會先把 n 強轉(zhuǎn)成 int苍在,然后運算 99 + 1荠商,所以輸出也是 int 類型的 100.

char 和 string 的區(qū)別

  • char 表示的是字符, 定義的時候用單引號, 只能存儲一個字符.
  • String 表示的是字符串, 定義的時候用雙引號, 可以存儲一個或者多個字符.
  • char 是基本數(shù)據(jù)類型, 而 String 是一個類, 屬于引用數(shù)據(jù)類型. String 類可以調(diào)用方法, 具有面向?qū)ο蟮奶卣?

參考

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末结啼,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子郊愧,更是在濱河造成了極大的恐慌,老刑警劉巖眠寿,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件焦蘑,死亡現(xiàn)場離奇詭異,居然都是意外死亡例嘱,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進店門奢浑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來腋腮,“玉大人,你說我怎么就攤上這事徊哑〈细唬” “怎么了莺丑?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵墩蔓,是天一觀的道長。 經(jīng)常有香客問我钢拧,道長,這世上最難降的妖魔是什么葡粒? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任膜钓,我火速辦了婚禮,結(jié)果婚禮上颂斜,老公的妹妹穿的比我還像新娘。我一直安慰自己盒让,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布姨蝴。 她就那樣靜靜地躺著肺缕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪同木。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天秕硝,我揣著相機與錄音斩萌,去河邊找鬼。 笑死颊郎,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的榛做。 我是一名探鬼主播,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼内狸,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了锰瘸?” 一聲冷哼從身側(cè)響起昂灵,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎眨补,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體含思,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡含潘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年调鬓,在試婚紗的時候發(fā)現(xiàn)自己被綠了酌伊。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片腾窝。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡虹脯,死狀恐怖奏候,靈堂內(nèi)的尸體忽然破棺而出循集,到底是詐尸還是另有隱情,我是刑警寧澤咒彤,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布咒精,位于F島的核電站,受9級特大地震影響模叙,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜范咨,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望渠啊。 院中可真熱鬧,春花似錦替蛉、人聲如沸贯溅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽熙含。三九已至罚缕,卻和暖如春怎静,著一層夾襖步出監(jiān)牢的瞬間邮弹,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工盟劫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留与纽,地道東北人侣签。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓急迂,卻偏偏與公主長得像影所,于是被迫代替她去往敵國和親僚碎。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,843評論 2 354