1. 方法 length():字符串中有多少个字符?
方法 length() 返回字符串中的字符数量。这与“字节数”并不完全相同(尤其当字符串中包含 emoji 或 Unicode 符号时),但对大多数任务而言,这正是所需要的。
使用示例
String name = "Vasilisa";
int length = name.length();
System.out.println("名字中的字母数量: " + length); // 8
为什么需要这个
- 检查用户是否输入了空字符串。
- 检查密码的最小/最大长度。
- 了解距离限制还剩多少字符(例如在 SMS 或推文中)。
示例:检查空字符串
String input = "";
if (input.length() == 0)
{
System.out.println("字符串为空!");
}
小技巧:用于检查“空”的还有 isEmpty() 方法,我们稍后再谈。
简短 FAQ
- length() 不接收参数(括号始终为空)。
- 如果字符串由空格组成,它们同样被计为字符!
- 如果字符串为 null,调用 length() 会导致 NullPointerException —— 请先检查是否为 null。
2. 方法 substring():提取字符串的一部分
方法 substring() 用于获取子串——按照给定索引“截取”一段。
有两种常用的调用形式:
- str.substring(startIndex) —— 从 startIndex 位置到字符串末尾。
- str.substring(startIndex, endIndex) —— 从 startIndex 到 endIndex(不包含索引为 endIndex 的字符)。
注意:字符串的索引从 0 开始。
使用示例
示例 1:获取名字的前三个字母
String name = "Vasilisa";
String firstThree = name.substring(0, 3); // "Vas"
System.out.println(firstThree);
示例 2:获取文件扩展名
String fileName = "document.pdf";
int dotIndex = fileName.indexOf(".");
String extension = fileName.substring(dotIndex + 1); // "pdf"
System.out.println(extension);
示例 3:字符串的最后 4 个字符
String cardNumber = "1234567890123456";
String lastFour = cardNumber.substring(cardNumber.length() - 4); // "3456"
System.out.println("最后 4 位数字: " + lastFour);
特点与注意事项
- 不合法的索引(startIndex < 0、endIndex > 长度、startIndex > endIndex)会抛出 StringIndexOutOfBoundsException。
- 该方法总是返回新字符串——原字符串不变。
- 双参数形式不会包含索引为 endIndex 的字符。
String str = "abcdef";
// 索引:0 1 2 3 4 5
str.substring(1, 4) → "bcd" // 索引为 1、2、3 的字符
substring(start, end) 的工作示意图
3. 方法 indexOf():查找字符或子串
方法 indexOf() 用于查找指定字符或子串第一次出现的位置(索引)。
- 找到时——返回索引(从 0 开始)。
- 未找到时——返回 -1。
使用示例
示例 1:找到 email 中的第一个点
String email = "ivan.petrov@mail.com";
int dotIndex = email.indexOf('.');
System.out.println("第一个点的位置: " + dotIndex); // 4
示例 2:查找子串
String text = "我喜欢 Java!";
int index = text.indexOf("Java");
System.out.println(index); // 4
示例 3:从指定位置之后查找字符
String s = "abracadabra";
int firstA = s.indexOf('a'); // 0
int secondA = s.indexOf('a', firstA + 1); // 3
System.out.println("第二个 'a' 在位置: " + secondA);
特点与注意事项
- 如果字符/子串出现多次,将返回第一次出现的位置。
- 要查找最后一次出现的位置请使用 lastIndexOf()。
- 字符请使用单引号:'a';子串请使用双引号:"abc"。
示例:查找文件扩展名
String fileName = "report.final.version.docx";
int lastDot = fileName.lastIndexOf('.');
String extension = fileName.substring(lastDot + 1);
System.out.println("文件扩展名: " + extension); // "docx"
4. 方法 charAt():按索引获取字符
方法 charAt(index) 按索引返回字符串中的字符。
使用示例
示例 1:检查字符串的第一个字母
String city = "Minsk";
char first = city.charAt(0); // 'M'
System.out.println("第一个字母: " + first);
示例 2:检查字符串是否以大写字母开头
String word = "Java";
if (Character.isUpperCase(word.charAt(0)))
{
System.out.println("单词以大写字母开头!");
}
示例 3:遍历字符串的所有字符
String text = "Hello";
for (int i = 0; i < text.length(); i++)
{
System.out.println("字符 #" + i + ": " + text.charAt(i));
}
特点与注意事项
- 索引超出范围(例如 -1 或 >= 长度)将导致 StringIndexOutOfBoundsException。
- 该方法返回的是 char,而不是字符串。
5. 方法 toCharArray():将字符串转换为字符数组
方法 toCharArray() 是把字符串转换成字符数组(char[])的简便方式。适用于逐字符处理、排序、校验等场景。
使用示例:
String text = "Hello";
char[] characters = text.toCharArray();
for (char c : characters)
{
System.out.println(c);
}
// 输出:
// H
// e
// l
// l
// o
为什么需要这个:
- 字符处理:对于逐字符逻辑(如变位词校验),数组更方便。
- 兼容性:有些 API 需要 char[] 作为参数。
6. 方法 replace():替换子串
方法 replace(CharSequence target, CharSequence replacement) 会将所有出现的 target 子串替换为 replacement。返回新字符串,原字符串不变。
使用示例:
String sentence = "我喜欢用 Java 编程。";
String newSentence = sentence.replace("Java", "Java 25");
System.out.println(newSentence);
// 输出: 我喜欢用 Java 25 编程。
String email = "support@company.com";
String cleanEmail = email.replace("@", "[at]");
System.out.println(cleanEmail);
// 输出: support[at]company.com
特点与注意事项
- 会替换所有出现的位置。
- String 是不可变的:replace() 返回新字符串。
- 复杂规则请使用带正则的 replaceAll()。
7. 方法 trim() 和 strip():去除空白
这两个方法都会移除字符串开头和结尾的“不可见”字符。
- trim() —— 经典方法:移除空格、制表符、换行符以及部分控制字符,但不涵盖所有 Unicode 空白。
- strip() —— 现代方法:依据 Unicode 标准考虑所有空白字符。在新项目中更推荐。
使用示例:
String s1 = " 你好,世界! ";
System.out.println(s1.trim());
// 输出: "你好,世界!"
String s2 = " \u2005 Java 11 \u2005 "; // \u2005 —— 这是一个 Unicode 空格
System.out.println("trim(): " + s2.trim());
System.out.println("strip(): " + s2.strip());
// 输出:
// trim(): Java 11
// strip(): Java 11
为什么需要这个:
- 清理用户输入中多余的空白。
- 在处理前对来自文件/日志的数据进行规范化。
8. 实践:解题
任务 1:检查密码长度
String password = "qwerty";
if (password.length() < 8)
{
System.out.println("密码太短!");
}
else
{
System.out.println("密码合适。");
}
任务 2:从全名中提取名字
String fullName = "Ivanov Ivan Ivanovich";
int firstSpace = fullName.indexOf(' ');
String name = fullName.substring(firstSpace + 1, fullName.indexOf(' ', firstSpace + 1));
System.out.println("名字: " + name); // "Ivan"
任务 3:检查字符串是否以指定字母开头
String surname = "Petrov";
if (surname.charAt(0) == 'P')
{
System.out.println("姓氏以字母 P 开头");
}
任务 4:从 email 中获取域名
String email = "vasya.pupkin@gmail.com";
int at = email.indexOf('@');
String domain = email.substring(at + 1);
System.out.println("域名: " + domain); // "gmail.com"
任务 5:找到字符串中所有字母 'a' 的出现位置
String s = "abracadabra";
int pos = s.indexOf('a');
while (pos != -1)
{
System.out.println("字母 'a' 出现在位置: " + pos);
pos = s.indexOf('a', pos + 1); // 从上一次找到的位置继续查找
}
9. 使用 String 方法时的常见错误
错误 1:越界访问
经常会混淆索引,从而访问不存在的字符/子串。
String s = "Java";
char c = s.charAt(4); // 错误!索引为 0..3
String s = "Hello";
String sub = s.substring(3, 10); // 错误!字符串长度为 5
错误 2:混淆是否包含 end 索引
方法 substring(start, end) 包含索引为 start 的字符,但不包含索引为 end 的字符。
错误 3:当未找到子串时,期待 indexOf 返回除 -1 以外的值
使用前请先检查返回结果,尤其是在随后要把它用于 substring 的情况下。
错误 4:错误处理空字符串
如果字符串为空(""),调用 charAt(0) 或 substring(0, 1) 会导致错误。请先检查长度。
错误 5:处理 null 字符串
如果字符串为 null,调用任何方法(length()、substring() 等)都会抛出 NullPointerException。处理前务必先判空。
GO TO FULL VERSION