Java 字符串
在 Java 基本數據類型一節中,我們已經知道 Java 中有兩大數據類型:一個是基本數據類型,另一個是引用數據類型。
字符串(String
)便屬于引用數據類型。字符串在 Java 程序中無處不在,其實我們在第一個 Java 程序中就已經使用過了字符串,打印語句中雙引號中的Hello World
就是一個字符串:System.out.println("Hello World");
本小節我們將介紹字符串的基礎知識,告訴你如何創建一個字符串,也會講到 Java 13
支持的多行字符串的創建方法和注意事項,還會介紹很常用的字符串的連接操作,最后我們也會著重討論字符串的一個重要特性:不可變性。
需要注意的是,String
是在java.lang
包中定義的內置類,了解它的相關操作需要面向對象的前置知識,為了減少初學者的困擾,字符串的相關操作不會在本小節討論。我們將在完成面向對象的學習后專門講解String
類。
1. 什么是字符串
字符串(string
)是由零個或多個字符組成的有限序列,它是編程語言中表示文本的數據類型。簡單來說,字符串就是一串字符。
2. 創建字符串
2.1 創建字符和字符串
提到字符串,就很容易與字符關聯起來,回憶我們已經學過的字符類型char
,在代碼中我們是這樣創建字符的:
// 依次創建三個字符 慕 課 網
char c1 = '慕';
char c2 = '慕';
char c3 = '網';
與char
類型不同的是,String
類型使用雙引號來表示一個字符串(例如:"字符串文字"
),在代碼中我們可以這樣創建字符串:
String str = "慕課網";
我們再來看一個創建并打印字符串的程序示例:
public class StringTest1 {
public static void main(String[] args) {
// 創建一個空字符串
String str1 = "";
// 創建一個只包含一個字符的字符串
String str2 = "q";
// 創建包含多個字符的字符串
String str3 = "imooc is great!";
// 依次打印它們
System.out.println(str1);
System.out.println(str2);
System.out.println(str3);
}
}
運行結果:
q
imooc is great!
字符串可以聲明為空,因此第一行將打印一個空行。
2.2 創建多行字符串
自Java 13
以后,我們可以使用三引號來表示一個多行字符串,被官方稱為“文本塊”。文本塊常用來表示多行的或大段的文字。例如:
public class StringTest3 {
public static void main(String[] args) {
String str = """
Java 很棒!
慕課網很棒?。? 能夠在慕課網學 Java 更棒?。?!""";
System.out.println(str);
}
}
Tips:
這里需要注意的是,文本塊中起始的三引號后面要另起一行,也就是說下面這種寫法是錯誤的:
String str = """Java 很棒! 慕課網很棒??! 能夠在慕課網學 Java 更棒?。?!""";
如果我們直接使用javac
命令編譯代碼,將會報錯:
javac StringTest3.java
StringTest3.java:4: 錯誤: 文本塊 是預覽功能,默認情況下禁用。
String str = """
^
(請使用 --enable-preview 以啟用 文本塊)
1 個錯誤
報錯告訴我們:文本塊是預覽功能,默認是禁用的。我們可以給編譯器加上一些參數來編譯執行代碼:
$ javac -source 14 --enable-preview StringTest3.java
$ java --enable-preview StringTest3
Java 很棒!
慕課網很棒??!
能夠在慕課網學 Java 更棒?。?!
2. 字符串的連接
我們可以使用加法運算符+
將字符串和任意其他的數據類型進行連接操作。
可以將兩個或多個字符串連接在一起,例如:
public class StringJoinTest1 {
public static void main(String[] args) {
// 定義兩個字符串
String str1 = "Hello";
String str2 = "慕課網";
// 將字符串str1連接一個空格,再連接str2,最后再連接一個感嘆號
String str3 = str1 + " " + str2 + "!";
System.out.println(str3);
}
}
運行結果:
$ javac StringJoinTest1.java
$ java StringJoinTest1
Hello 慕課網!
我們還可以將字符串與其他類型的值相連接,例如:
public class StringJoinTest2 {
public static void main(String[] args) {
// 定義整型變量 age
int age = 12;
// 定義浮點型變量 height
float height = 132.5f;
// 定義一個字符串變量 name
String name = "小明";
// 將上面三個變量連接,拼成一個更長的字符串
String result = name + "今年" + age + "歲了," + "他的身高為" + height + "cm";
System.out.println(result);
}
}
運行結果:
小明今年10歲了,他的身高為132.5cm
我們知道加法運算符除了可以連接字符串,也可以進行數學的加法運算。那我們再來看一個實例:
public class StringJoinTest3 {
public static void main(String[] args) {
// 定義兩個整型變量a、b
int a = 100;
int b = 200;
// 打印一個空字符串+a+b的值
System.out.println("" + a + b);
}
}
試想屏幕上將會得到什么結果呢?編譯執行代碼:
$javac StringJoinTest3
java StringJoinTest
100200
這里結果沒有打印300
的原因很簡單: 按照從左到右的執行順序,(空字符串 + 數值100
)的運算結果應該是字符串100
,然后再運算(字符串100
+數值200
),其最終結果為字符串100200
。由于運算中有字符串的存在,+
運算符在這里用于字符串的連接而不是數值的計算。
試想,如果將表達式中的操作數倒過來(即b + a + ""
),將得到什么結果呢?
3. 字符串的不可變性
字符串有一個重要特性:不可變性。也就是說,字符串一經創建便無法修改。我們來看一個示例:
public class StringTest4 {
public static void main(String[] args) {
// 創建一個字符串 str
String str = "hello imooc!";
// 對 str 重新賦值
str = "Java is great!";
System.out.println(str);
}
}
運行結果:
Java is great!
童鞋們可能發現,咦?不是說字符串一旦創建就無法修改了嗎,怎么str
變量依然被修改成了新的值?
這里直接給出答案:上述例子中,變量str
沒有修改,而是變量str
的“指向”被修改了。
我們通過圖示來描述上述代碼的執行流程,首先創建一個str
,指向"hello imooc!":

當對str
重新賦值后,在內存中先創建了字符串"Java is great",然后改變了變量str
的指向,原來的"hello imooc!"并沒有發生改變:

4. 小結
通過本小節的學習,我們了解了字符類型char
是基本數據類型,而字符串類型String
是引用類型。在創建字符串時,我們可以使用雙引號表示,從Java 13
起,加入了多行字符串的表示方法。字符串的連接操作是使用加法運算符實現的。最后要特別注意字符串的不可變性,這在面試中經常會考到。