如何遍历字符串[重复]
Posted
技术标签:
【中文标题】如何遍历字符串[重复]【英文标题】:How to iterate through a String [duplicate] 【发布时间】:2011-04-17 11:32:51 【问题描述】:如何在 Java 中遍历字符串?
我正在尝试使用 foreach 样式进行循环
for (char x : examplestring)
//action
【问题讨论】:
【参考方案1】:Java String
s 不是字符 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.charactersOf
以List
的形式返回字符串的视图。
【讨论】:
+1。我不知道r07已经出来了。不过,有趣的是,这是可用选项中最慢的。完成时间比同等的charAt
测试多 49%。
@Gunslinger47:我想为此对每个字符进行装箱和拆箱的需要会减慢一点速度。该方法可能更旨在调整字符串以用于各种基于 Collection
的 API,而不仅仅是像这样的迭代。【参考方案4】:
这个怎么样
for (int i = 0; i < str.length(); i++)
System.out.println(str.substring(i, i + 1));
【讨论】:
以上是关于如何遍历字符串[重复]的主要内容,如果未能解决你的问题,请参考以下文章