1. 概述

在这个教程中,我们将了解遍历字符串字符的方法,以及它们的时间复杂度和空间复杂度。

2. 遍历字符串的常见方式

在Java中,有几种遍历字符串字符的方法,每种方法都有其特定的时间和空间复杂度。选择哪种方法取决于你的程序的具体需求。

2.1. for 循环

我们可以使用简单的for循环来遍历字符串的字符。这种方法的时间复杂度为 O(n),其中 n 是字符串 str 的长度,空间复杂度为 O(1),因为它只需要一个循环变量:

String str = "Hello, Baeldung!";
for (int i = 0; i < str.length(); i++) {
    char c = str.charAt(i); 
    System.out.print(c)
}

2.2. toCharArray() 方法

toCharArray() 方法首先将字符串转换为字符数组,以便进行迭代。 这个方法的时间复杂度为 O(n),其中 n 是字符串 str 的长度,空间复杂度为 O(n),因为它创建了一个新的 char 数组:

String str = "Hello, Baeldung!"; 
for (char c : str.toCharArray()) { 
    System.out.print(c);
}

2.3. Java 8 流程

我们可以使用 Java 8 的流(Streams)来处理字符串中的每个字符。 这种方法的时间复杂度为 O(n),而空间复杂度取决于你在流上执行的中间操作:

String str = "Hello, Baeldung!"; 
str.chars().forEach(c -> { 
    System.out.print((char) c);
});

注意:上述代码中,我们需要将变量 c 类型转换为 char,因为 chars() 返回的是一个 IntStream

2.4. CharacterIterator

我们使用以下 CharacterIterator 的方法来遍历字符串。

  • current(): 获取当前字符
  • next(): 向前移动一个位置

StringCharacterIterator 提供了 CharacterIterator 的实现。这个接口允许我们在字符串上进行双向迭代。迭代器遍历一个有限的字符序列。迭代器维护一个当前字符索引,其有效范围是 getBeginIndex()getEndIndex()

这里的时间复杂度为 O(n),其中 n 是字符串 str 的长度,空间复杂度为 O(1),因为它只需要一个单层 while 循环迭代器:

String str = "Hello, Baeldung!";
CharacterIterator it = new StringCharacterIterator(str);
while (it.current() != CharacterIterator.DONE) {
    System.out.print(it.current());
    it.next();
}

3. 总结

选择哪种方法取决于具体的应用场景。对于大多数情况,简单的 for 循环或增强的 for 循环是最直接且高效的遍历字符串字符的方式。它们具有低的空间复杂度,并且时间复杂度为 O(n),这是此类任务的最佳性能。

当我们需要对字符执行复杂操作,或者想利用 Java 8 提供的函数式编程能力时,可以使用 Java 8 流程。如往常一样,所有这些示例的源代码可在 GitHub 上找到。