简单的StringBuilder构造函数/方法问题

Ste*_* P. 5 java

我有一个StringIndexOutOfBoundsExceptionsetCharAt(int index, char ch):

StringBuilder word = new StringBuilder(4);

for(int i = 0; i < 4; i++)
    word.setCharAt(i,'-');
Run Code Online (Sandbox Code Playgroud)

StringBuilder(int capacity):构造一个不包含字符的字符串构建器以及capacity参数指定的初始容量.

setCharAt(int index, char ch):指定索引处的字符设置为ch.

我唯一能想到的是没有分配内存,但那又有什么意义StringBuilder(int capacity)呢?

jah*_*roy 6

只是用 StringBuilder.append()

您正在使用的构造函数不会将任何数据放入StringBuilder中.

它只为StringBuilder指定了一个实际大小(我相信它是为了性能).

直到你实际把东西放在StringBuilder中,你的代码才会抛出异常.

请注意,您引用的文档明确说明了这一点:

" 构造一个字符串生成器,其中 没有字符 ...... "

  • 我建议阅读源代码以找出答案.我相信容量主要用于内部性能(随着StringBuilder的增长),但我不确定. (2认同)

Tim*_*der 5

我唯一能想到的是没有分配内存,但是 StringBuilder(intcapacity) 有什么意义呢?

关键是提供一个预先机会来分配足够大的内存块来处理将插入的所有数据。当超出容量时,必须在内部分配一个新的内存块,并复制旧内存中的所有值。正如您可以想象的那样,如果多次发生,这可能会造成性能负担。

这种行为并不奇怪或出人意料,事实上它与封装的实践非常一致。

会做什么呢ArrayList?AnArrayList由数组支持,并且使用足够的初始容量会提高性能,但是这样做仍然不允许任意访问数组的索引。

我认为奇怪的行为是将 a 视为StringBuildera 的表示char[]。该表示形式已正确封装,不要以奇怪的方式戳它。