String 在 Java 中是一个极其核心和特殊的类,它的返回值贯穿了整个 Java 开发,我们可以从几个层面来理解它的返回值。

- 不可变性:
String对象是不可变的,任何对字符串的修改操作(如substring,replace,toUpperCase等)都不会修改原始字符串,而是返回一个新的String对象来表示修改后的结果。 - 常用返回值类型:
String: 这是最常见的返回值,用于返回一个新的字符串。int: 用于返回字符的 Unicode 码点或子字符串的起始索引。boolean: 用于判断字符串是否满足某个条件(如是否为空、是否以某串开头等)。char[]: 用于将字符串内容转换为字符数组。byte[]: 用于将字符串按指定编码转换为字节数组。Stream<Character>或IntStream: 用于进行函数式编程风格的流式处理。String[]: 用于将字符串按某个分隔符拆分成一个字符串数组。
不可变性 - 理解 String 返回值的关键
这是最重要的一点,当你调用一个 String 的方法时,你需要清楚它是否会改变原来的字符串。
规则:所有 String 类中用于修改内容的方法,都不会改变调用它们的那个 String 对象本身,而是返回一个新的 String 对象。
示例代码:
public class StringReturnExample {
public static void main(String[] args) {
String original = "Hello World";
// 调用 toUpperCase() 方法
// original 变量本身没有被改变
String uppercased = original.toUpperCase();
System.out.println("Original string: " + original); // 输出: Hello World
System.out.println("Uppercased string: " + uppercased); // 输出: HELLO WORLD
// 调用 replace() 方法
String replaced = original.replace("World", "Java");
System.out.println("Original string: " + original); // 输出: Hello World
System.out.println("Replaced string: " + replaced); // 输出: Hello Java
}
}
分析:

original.toUpperCase()返回了一个新的字符串"HELLO WORLD",并将其赋值给uppercased变量。original本身仍然是"Hello World"。original.replace(...)返回了一个新的字符串"Hello Java",并将其赋值给replaced变量。original依然没有改变。
按功能分类:常见 String 方法的返回值
下面我们按功能分类,详细列出常用 String 方法的返回值及其用途。
A. 查询与判断方法 (返回 boolean 或 int)
这些方法通常用于获取信息或进行条件判断。
| 方法名 | 返回值类型 | 描述 |
|---|---|---|
equals(Object anObject) |
boolean |
比较此字符串与指定对象是否相等(区分大小写)。 |
equalsIgnoreCase(String anotherString) |
boolean |
比较此字符串与另一个字符串是否相等(不区分大小写)。 |
contains(CharSequence s) |
boolean |
判断字符串是否包含指定的字符序列。 |
startsWith(String prefix) |
boolean |
判断字符串是否以指定的前缀开头。 |
endsWith(String suffix) |
boolean |
判断字符串是否以指定的后缀结尾。 |
isEmpty() |
boolean |
判断字符串长度是否为 0。 |
length() |
int |
返回字符串的长度。 |
charAt(int index) |
char |
返回指定索引处的 char 值。 |
indexOf(String str) |
int |
返回子字符串第一次出现的索引,如果不存在则返回 -1。 |
lastIndexOf(String str) |
int |
返回子字符串最后一次出现的索引,如果不存在则返回 -1。 |
示例:
String text = "Java is fun";
boolean containsFun = text.contains("fun"); // 返回 true
boolean startsWithJava = text.startsWith("Java"); // 返回 true
int length = text.length(); // 返回 11
int indexOfIs = text.indexOf("is"); // 返回 5
B. 修改与构造方法 (返回 String)
这些方法会基于原始字符串创建一个新字符串。

| 方法名 | 返回值类型 | 描述 |
|---|---|---|
substring(int beginIndex) |
String |
返回一个子字符串,从 beginIndex 开始到末尾。 |
substring(int beginIndex, int endIndex) |
String |
返回一个子字符串,从 beginIndex 开始到 endIndex - 1。 |
concat(String str) |
String |
返回一个新字符串,内容为此字符串后面连接 str 字符串。 ( 运算符更常用) |
replace(char oldChar, char newChar) |
String |
返回一个新字符串,所有 oldChar 被替换为 newChar。 |
replaceAll(String regex, String replacement) |
String |
返回一个新字符串,所有匹配正则表达式 regex 的子串被替换。 |
toUpperCase() / toLowerCase() |
String |
返回一个新字符串,所有字符分别转换为大写/小写。 |
trim() |
String |
返回一个新字符串,移除了首尾的空白字符。 |
String.valueOf(...) |
String |
静态方法,将各种基本数据类型或对象转换为字符串。 |
示例:
String s = " Hello, Java! ";
String trimmed = s.trim(); // 返回 "Hello, Java!"
String upper = s.toUpperCase(); // 返回 " HELLO, JAVA! "
String sub = s.substring(2, 7); // 返回 "Hello"
String replaced = s.replace("Java", "World"); // 返回 " Hello, World! "
C. 转换方法 (返回 char[], byte[], String[])
这些方法用于将字符串转换为其他数据结构。
| 方法名 | 返回值类型 | 描述 |
|---|---|---|
toCharArray() |
char[] |
返回一个新分配的字符数组,包含此字符串中的所有字符。 |
getBytes() |
byte[] |
返回一个字节数组,按平台默认字符集编码。 |
getBytes(String charsetName) |
byte[] |
返回一个字节数组,按指定字符集编码。 |
split(String regex) |
String[] |
返回一个字符串数组,按给定的正则表达式拆分此字符串。 |
示例:
String text = "apple,banana,cherry";
// 转换为字符数组
char[] chars = text.toCharArray(); // chars 是 ['a', 'p', 'p', 'l', 'e', ',', ...]
// 拆分为字符串数组
String[] fruits = text.split(","); // fruits 是 ["apple", "banana", "cherry"]
D. Java 8+ 新增:流式处理方法 (返回 Stream)
Java 8 引入了 Stream API,String 也提供了相应的方法来支持函数式编程。
| 方法名 | 返回值类型 | 描述 |
|---|---|---|
chars() |
IntStream |
返回一个 int 的流,流的元素是此字符串中的字符的 Unicode 码点。 |
codePoints() |
IntStream |
返回一个 int 的流,流的元素是此字符串中的字符的 Unicode 码点,能更好地处理增补字符。 |
lines() |
Stream<String> |
返回一个字符串的流,按行分割(按 \n, \r, \r\n)。 |
示例:
String multilineText = "Line 1\nLine 2\nLine 3";
// 按行处理
multilineText.lines()
.filter(line -> line.contains("2"))
.forEach(System.out::println); // 输出: Line 2
// 统计字符数(不包括空格)
long charCount = "Java is great".chars()
.filter(ch -> ch != ' ')
.count(); // 返回 11
特殊情况: (连接运算符) 的返回值
在 Java 中, 运算符可以用于连接字符串,它的行为稍微特殊。
- 如果任一操作数是
String类型, 会被当作连接运算符,并返回一个新的String对象。 - 如果两个操作数都是基本类型, 是加法运算符。
示例:
int num = 10; String text = "Score: "; // num 被自动转换为 "10",然后进行连接 String result = text + num; // 返回一个新的字符串 "Score: 10" System.out.println(result);
注意: 在循环中大量使用 连接字符串是低效的,因为每次连接都会创建一个新的 String 对象,推荐使用 StringBuilder 或 StringBuffer。
// 低效方式
String s = "";
for (int i = 0; i < 1000; i++) {
s = s + i; // 循环1000次,创建1000个新的String对象
}
// 高效方式
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 1000; i++) {
sb.append(i); // 在同一个StringBuilder对象上操作
}
String efficientResult = sb.toString(); // 最后只创建一个String对象
总结表格
| 功能类别 | 常见方法 | 返回值类型 | 核心要点 |
|---|---|---|---|
| 信息查询 | length(), indexOf(), charAt() |
int, char |
获取字符串的属性或位置信息。 |
| 条件判断 | equals(), startsWith(), contains() |
boolean |
判断字符串是否符合某个条件。 |
| 类型转换 | toCharArray(), getBytes(), split() |
char[], byte[], String[] |
将字符串转换为其他数据结构。 |
| 流式处理 | chars(), lines() |
IntStream, Stream<String> |
返回一个流,用于函数式操作。 |
| 字符串连接 | 运算符, concat() |
String |
返回一个新字符串,原字符串不变。 |
String 的不可变性 是理解其所有方法返回值的基础,只要涉及到内容“改变”,就一定会返回一个新对象。
