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

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

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