CodeGym /课程 /JAVA 25 SELF /String 的基本方法

String 的基本方法

JAVA 25 SELF
第 9 级 , 课程 3
可用

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) —— 从 startIndexendIndex(不包含索引为 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 < 0endIndex > 长度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。处理前务必先判空。

评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION