1. 基本特殊字符与转义
在编程中,字符串不仅由字母组成,还包含特殊字符:引号、换行、制表符,有时甚至是像 \n 和 \t 这样的转义标记。比如你想在字符串里写 你好, "user"!,编译器会立刻疑惑:“字符串里面的引号,是不是错误?”这时就需要转义机制了。
在 Java 中,转义是为字符串中的某些字符“赋予特殊含义”的方式。为此使用反斜杠 \(backslash)。
经典转义序列:
| 序列 | 说明 | 演示 |
|---|---|---|
|
换行 | 按下 Enter |
|
制表符(Tab) | Tab |
|
字面量“反斜杠” | |
|
字符串中的双引号 | |
|
单引号(在字符串中很少需要) | |
|
回车符(旧式换行,很少使用) | |
|
空字符(NUL) | (不可见) |
|
Backspace(删除前一个字符——在控制台并不总是生效) |
工作原理
我们写几行包含转义字符的字符串,看看它们的实际效果。
System.out.println("你好,\"用户\"!");
// 输出: 你好,"用户"!
System.out.println("C:\\Program Files\\MyApp");
// 输出: C:\Program Files\MyApp
System.out.println("第 1 行\n第 2 行");
// 输出:
// 第 1 行
// 第 2 行
System.out.println("我\t喜欢\t制表符!");
// 输出:
// 我 喜欢 制表符!
就这样,借助一个简单的反斜杠(\),你就能把几乎任何特殊字符“带进”字符串里,而不会让编译器或队友产生恐慌。
2. 多行字符串与换行
我们经常需要写多行消息或 ASCII 艺术。最直接的方式——在普通字符串里使用 \n。
System.out.println("第一行\n第二行\n第三行");
不过这并不总是方便,因此 Java 引入了文本块(Text Blocks)。它们以三引号 """ 开始,允许不转义地编写多行文本并保留格式——对 JSON、SQL 和 HTML 来说再合适不过。
// 多行字面量(Text Block)
String json = """
{
"name": "Alice",
"age": 30,
"skills": ["Java", "SQL", "Cloud"]
}
""";
System.out.println(json);
"""
借助文本块,你还能轻松创建包含引号的多行文本,无需重复转义。
3. Unicode——Java 如何存储世界上的任意字符
在现代世界里,我们不仅使用拉丁字母,还使用西里尔字母、汉字、数学符号,甚至表情符号。这一切都得益于字符编码系统——Unicode。
什么是 Unicode?
Unicode 是一个国际标准,它为每个字符分配唯一编号(code point),与语言和平台无关。借此你可以在 Java 中同时使用西里尔文字、英文、中文汉字,甚至罕见的特殊符号。
不同语言的字符串示例:
System.out.println("Hello, 世界! 你好! مرحبا!");
字符串中的 Unicode 符号
你可以直接写出编码支持的任意字符,或使用形如 \uXXXX 的转义序列,其中 XXXX 是4位十六进制的字符编码。
System.out.println("符号: \u263A"); // 将输出 😊
对于编码大于 65535 的字符(例如许多表情),会使用一对代理项(UTF-16):
// 符号 😊(码位 1F60A)由两个 char 表示
System.out.println("笑脸: \uD83D\uDE0A"); // 将输出 😊
这有什么用?
- 你可以存储并处理任何文本。
- 可以放心混合多种语言与非常规符号——Java 对 Unicode 开箱即用。
- 在面向国际用户和非标准字母表的场景中尤为重要。
4. 表情符号与特殊符号
现代字符串不仅包含字母,还包含表情符号(emoji)!例如,你想给用户发送一条带“笑脸”的愉快消息。
如何在字符串中加入表情?
直接在字符串中插入 emoji:
System.out.println("你好! 😊");
使用 Unicode 码: 对于大多数表情可以使用代理项对(surrogate pairs)。
System.out.println("这是一只猫:\uD83D\uDC31"); // 🐱
由于 UTF-16 的原因,表情在字符串中可能占用两个字符。因此在某些操作(例如获取长度)时可能出现“意外”:
String s = "😊";
System.out.println(s.length()); // 输出 2,而不是 1!
这是因为一个 Unicode 码位在 Java 中由两个 char 编码。要正确处理字符,请使用码位及相应的方法,而不是简单的 length()。
5. 坑点与常见错误
错误 1:在字符串中错误地使用引号。 如果不对内部引号进行转义,编译器会“认为”字符串已经结束。
System.out.println("他说: "你好!""); // 错误!
正确:
System.out.println("他说: \"你好!\"");
错误 2:路径里只写了一个反斜杠。 在 Java 中,\ 用于表示特殊字符(\n、\t、\f 等)。因此字符串 "C:\Temp\file.txt" 会被误解。
System.out.println("C:\Temp\file.txt"); // 错误或意外结果
正确:
System.out.println("C:\\Temp\\file.txt"); // 双反斜杠
错误 3:忽视文本块。 从 Java 15 开始请使用文本块——这会大大简化多行字符串的处理。
String path = """
C:\Temp\file.txt
""";
System.out.println(path);
核心规则:始终转义特殊字符与引号。这能避免隐蔽 bug,并节省大量调试时间。
GO TO FULL VERSION