【问题标题】:How to iterate through a String [duplicate]如何遍历字符串[重复]
【发布时间】:2011-04-17 11:32:51
【问题描述】:

如何在 Java 中遍历字符串?

我正在尝试使用 foreach 样式进行循环

for (char x : examplestring) {
    //action
}

【问题讨论】:

    标签: java string loops


    【解决方案1】:

    Java Strings 不是字符 Iterable。你需要:

    for (int i = 0; i < examplestring.length(); i++) {
      char c = examplestring.charAt(i);
      ...
    }
    

    我知道很尴尬。

    【讨论】:

      【解决方案2】:

      如果要使用增强循环,可以将字符串转换为charArray

      for (char ch : exampleString.toCharArray()) {
        System.out.println(ch);
      }
      

      【讨论】:

      • 这比我的版本差很多,因为它将String复制到函数返回的临时数组中。
      • @cletus - 您无法访问原始数组 - 字符串是不可变的,因此源数组应该相同。但是在 Java 中,您总是可以修改数组,这会导致破坏 Java 优化(实习)。无论如何,一份比许多length()charAt() 要快。
      • @gertas 这正是我所说的。因为数组是可变的,所以必须防御性地复制它。所以你有那个副本的成本是为了什么?语法糖。这就是为什么这是一个坏主意。
      • @cletus:但这里不是语法糖。一般来说,我们有相当内存与 cpu 的问题。我不介意 JVM 是否以某种方式优化了对 String 方法的访问,但您仍然为每个字符调用 .lenght().charAt()
      • @gertas:您需要对 Java 的优化编译器给予更多评价。在我的机器(jre7-32bit-single)上,按索引迭代比通过 char[] 副本迭代快 2%。
      【解决方案3】:

      使用Guava (r07) 你可以这样做:

      for(char c : Lists.charactersOf(someString)) { ... }
      

      这具有使用 foreach 的便利性,而 将字符串复制到新数组。 Lists.charactersOfList 的形式返回字符串的视图

      【讨论】:

      • +1。我不知道r07已经出来了。不过,有趣的是,这是可用选项中最慢的。完成时间比同等的 charAt 测试多 49%。
      • @Gunslinger47:我想为此对每个字符进行装箱和拆箱的需要会减慢一点速度。该方法可能更旨在调整字符串以用于各种基于 Collection 的 API,而不仅仅是像这样的迭代。
      【解决方案4】:

      这个怎么样

      for (int i = 0; i < str.length(); i++) { 
          System.out.println(str.substring(i, i + 1)); 
      } 
      

      【讨论】:

        猜你喜欢
        • 2010-11-12
        • 1970-01-01
        • 2018-11-19
        • 1970-01-01
        • 2018-05-15
        相关资源
        最近更新 更多