9.3 字符串遍历

下面的循环遍历了字符串变量 fruit 中的字符,并以每个字符独占一行的方式显示:

  1. for (int i = 0; i < fruit.length(); i++) {
  2. char letter = fruit.charAt(i);
  3. System.out.println(letter);
  4. }

字符串提供了一个名为 length 的方法,该方法返回了字符串包含的字符数。因为这是一个方法,所以调用它时必须指定空的实参列表——()

条件为 i,这意味着当 i 与字符串长度相等时,这个条件为 false,循环将终止。

遗憾的是,改进的 for 循环不能用于遍历字符串。但你可以将任何字符串转换为字符数字,再用改进的 for 循环来迭代:

  1. for (char letter : fruit.toCharArray()) {
  2. System.out.println(letter);
  3. }

为获取字符串的最后一个字符,你可能试图像下面这样做:

  1. int length = fruit.length();
  2. char last = fruit.charAt(length); // 不对!

这些代码能够通过编译并运行,但其中对方法 charAt 的调用将引发 StringIndexOutOfBoundsException 异常,这是因为 "banana" 没有索引为 6 的字符。由于索引从 0 开始,这 6 个字符的索引为 0~5。要获取最后一个字符,必须将 length 减 1。

  1. int length = fruit.length();
  2. char last = fruit.charAt(length - 1); // 正确

很多字符串遍历操作涉及读取一个字符串并创建另一个字符串。例如,要想反转字符串,可按从后到前的顺序将字符依次加入到另一个字符串中:

  1. public static String reverse(String s) {
  2. String r = "";
  3. for (int i = s.length() - 1; i >= 0; i--) {
  4. r = r + s.charAt(i);
  5. }
  6. return r;
  7. }

r 的初始值为 "",即空字符串(empty string);其中的循环按从后到前的顺序遍历 s 中的所有字符。每次执行循环时都创建一个新的字符串,并将其赋给 r。循环结束时,r 包含 s 的所有字符,但排列顺序相反。因此,reverse("banana") 的结果为 "ananab"