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

當(dāng)對str
重新賦值后,在內(nèi)存中先創(chuàng)建了字符串"Java is great",然后改變了變量str
的指向,原來的"hello imooc!"并沒有發(fā)生改變:

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