字符類型
字符類型char是基本數據類型,它是character的縮寫。一個char保存一個Unicode字符:
char c1='A'; char c2='中';
因為Java在內存中總是使用Unicode表示字符,所以,一個英文字符和一個中文字符都用一個char
類型表示,它們都占用兩個字節。要顯示一個字符的Unicode編碼,只需將char
類型直接賦值給int
類型即可:
int n1 = 'A'; // 字母“A”的Unicodde編碼是65 int n2 = '中'; // 漢字“中”的Unicode編碼是20013
還可以直接用轉義字符\u+Unicode編碼來表示一個字符:
// 注意是十六進制: char c3 = '\u0041'; // 'A',因為十六進制0041 = 十進制65 char c4 = '\u4e2d'; // '中',因為十六進制4e2d = 十進制20013
字符串類型
和char
類型不同,字符串類型String
是引用類型,我們用雙引號"..."
表示字符串。一個字符串可以存儲0個到任意個字符:
String s = ""; // 空字符串,包含0個字符 String s1 = "A"; // 包含一個字符 String s2 = "ABC"; // 包含3個字符 String s3 = "中文 ABC"; // 包含6個字符,其中有一個空格
因為字符串使用雙引號"..."
表示開始和結束,那如果字符串本身恰好包含一個"
字符怎么表示?例如,"abc"xyz"
,編譯器就無法判斷中間的引號究竟是字符串的一部分還是表示字符串結束。這個時候,我們需要借助轉義字符\
:
String s = "abc\"xyz"; // 包含7個字符: a, b, c, ", x, y, z
因為\
是轉義字符,所以,兩個\\
表示一個\
字符:
String s = "abc\\xyz"; // 包含7個字符: a, b, c, \, x, y, z
常見的轉義字符包括:
\"
表示字符"
\'
表示字符'
\\
表示字符\
\n
表示換行符\r
表示回車符\t
表示Tab\u####
表示一個Unicode編碼的字符
例如
String s = "ABC\n\u4e2d\u6587"; // 包含6個字符: A, B, C, 換行符, 中, 文
字符串連接
Java的編譯器對字符串做了特殊照顧,可以使用+連接任意字符串和其他數據類型,這樣極大地方便了字符串的處理。例如:
public class Main { public static void main(String[] args) { String s1="Hello"; String s2="world"; String s=s1+" "+s2+"!"; System.out.println(s); } }
多行字符串
如果我們要表示多行字符串,使用+號連接會非常不方便:
String s = "first line \n" + "second line \n" + "end";
從Java 13開始,字符串可以用"""..."""
表示多行字符串(Text Blocks)了。舉個例子:
不可變特性
Java的字符串處理是一個引用類型外,還有個重要特點,就是字符串不可變
public class Main { public static void main(String[] args) { String s = "hello"; System.out.println(s); // 顯示 hello s = "world"; System.out.println(s); // 顯示 world } }
運行結果
hello world
觀察執行結果,難道字符串s
變了嗎?其實變的不是字符串,而是變量s
的“指向”。
執行String s = "hello";
時,JVM虛擬機先創建字符串"hello"
,然后,把字符串變量s
指向它:
緊接着,執行s = "world";
時,JVM虛擬機先創建字符串"world"
,然后,把字符串變量s
指向它:
原來的字符串"hello"
還在,只是我們無法通過變量s
訪問它而已。因此,字符串的不可變是指字符串內容不可變。
空值null
引用類型的變量可以指向一個空值null
,它表示不存在,即該變量不指向任何對象。例如:
String s1 = null; // s1是null String s2; // 沒有賦初值值,s2也是null String s3 = s1; // s3也是null String s4 = ""; // s4指向空字符串,不是null
注意要區分空值null
和空字符串""
,空字符串是一個有效的字符串對象,它不等於null
。
練習
請將一組int值視為字符的Unicode編碼,然后將它們拼成一個字符串:
public class Main { public static void main(String[] args) { int a=72; int b=105; int c=65281; String s=""+(char)a+(char)b+(char)c; System.out.println(s); } }
運行結果
Hi!
說明:為什么第一個是“”,有了第一個空的string,后面的 + 就是字符串的連接了操作符了,而不再是 char/int 的數值相加了。