定義
甲骨文官方對于原始數(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).
可以知道主要以下三點:
- char 類型是原始類型
- Unicode 字符 (額外補充, 采用 UTF-16 的編碼形式)
- 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ū)ο蟮奶卣?