Java中迭代StringBuilder的标准方法是什么?

9
我很惊讶地发现没有现成的问题回答这个问题。
在Java中,遍历StringBuilder中所有字符的标准方法是什么?
显而易见的方法是将其转换为字符串,然后使用toCharArray()。但问题是,我正在处理成千上万个唯一的字符串,并对它们进行大量的附加操作,我认为我正在从必须内部化它们所产生的内存和性能问题中受挫。
编辑:澄清一下,我不是手动内部化字符串,但我的理解是它们会自动内部化,如果我为StringBuilder调用toString(),它们将被内部化。也许我误解了。

2
StringBuilder确实有一个charAt()方法。您可以使用该方法迭代每个字符。 - TheLostMind
1
这在性能方面会是什么样子?charAt()提供O(1)访问吗? - jmite
2
你正在从一个数组中读取,所以是的,它将是O(1)。 - TheLostMind
3
如果您对性能非常关注,也许可以退回使用byte[]或char[],具体取决于如何获取这些“字符串”。首先,您是如何填充StringBuilder的? - Valentin Ruano
2
据我所知,仅代码中的字符串字面量和您调用intern()方法的字符串以及一些基本常量(如"")会被内部化,否则它们根本不会被内部化。 - Valentin Ruano
显示剩余4条评论
1个回答

17

首先,如果你正在大量使用字符串,那么你正在做一些非常错误的事情。

更一般地说,StringBuilder 实现了 CharSequence,就像 String 一样。使用普通的基于计数器的 for 循环和 charAt() 方法。


  1. 我如何避免字符串的内部化?我几乎在所有操作中都使用 StringBuilder,尽可能避免使用字符串。您能详细说明一下“非常非常错误”的含义以及如何避免它吗?
  2. charAt() 方法提供 O(1) 访问吗?
- jmite
1
@jmite 1. 当使用Builder时,您不会对任何内容进行实习。事实上,除非您在构建的字符串上显式调用intern(),否则不会从构建的字符串中实习任何内容。但是,您甚至还没有创建字符串对象,您可以直接从可变的Builder中完成所有这些操作。2. 是的,charAt()确实提供了对基础数组的O(1)访问。 - dkatzel
好的。我知道StringBuilders不是被interned的,这就是为什么我在使用它们。我担心如果我使用toString,它们会被interned。我将使用charAt来代替,看看它的效果如何。谢谢! - jmite

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接