Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 简单StringBuilder构造函数/方法问题_Java - Fatal编程技术网

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

Java 简单StringBuilder构造函数/方法问题,java,Java,对于setCharAt(int-index,char-ch),我得到了一个StringIndexOutOfBoundsException: StringBuilder word=新的StringBuilder(4); 对于(int i=0;i

对于
setCharAt(int-index,char-ch)
,我得到了一个
StringIndexOutOfBoundsException

StringBuilder word=新的StringBuilder(4);
对于(int i=0;i<4;i++)
单词.setCharAt(i,“-”);
StringBuilder(int-capacity)
:构造一个字符串生成器,其中不包含字符,初始容量由capacity参数指定

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

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

只要使用

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

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

在您真正将内容放入StringBuilder之前,您的代码将抛出异常

请注意,您引用的文档明确指出:

“构造一个不包含字符的字符串生成器…”


StringBuilder
中,这似乎有点奇怪

在继承的
AbstractStringBuilder
中,构造函数定义为:

AbstractStringBuilder(int capacity) {
    value = new char[capacity];
}
但是,当使用
setCharAt()
时,我们会检查
count

public void setCharAt(int index, char ch) {
    if ((index < 0) || (index >= count))
        throw new StringIndexOutOfBoundsException(index);
    value[index] = ch;
}
public void setCharAt(int-index,char-ch){
如果((索引<0)| |(索引>=计数))
抛出新StringIndexOutOfBoundsException(索引);
值[指数]=ch;
}
因此,由于我们没有使用初始构造函数设置
count
,我们面临一个错误

count
append()
replace()
insert()
setLength()
中重新定义。你可以;但是,只使用
append()
更简单

相关源代码:

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

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

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

ArrayList
会做什么?
ArrayList
由数组支持,使用足够的初始容量会更有效,但是这样做仍然不允许对数组的索引进行任意访问


我认为奇怪的行为是将
StringBuilder
视为
char[]
的表示形式。这个表示法是正确封装的,不要用奇怪的方式戳它。

这就是我最终要做的。我只是想知道,如果不分配内存,构造函数实际上做什么?我知道里面没有字符,但是为什么需要有呢?我建议阅读源代码来找出答案。我相信容量主要用于内部性能(随着StringBuilder的增长),但我不确定。我从未看过源代码,但我认为它看起来是这样的,这就是为什么我在遇到异常时感到如此困惑的原因。@SteveP。是 啊从技术上讲,它应该让你。但是它没有检查
value.length
,而是检查未更新的
count
。实际上很难说这是否是设计的。@TimBender(我知道。:P)我想说,如果我手动设置容量,它应该允许我以我认为合适的方式操作数据。在默认构造函数的情况下,它在数组中分配16个块,但我应该不能访问它们。不过,就容量的明确设置而言,我认为这是不同的。(我想,被迫调用
setLength()
并没有那么糟糕。)也许他们应该把参数的名称从capacity改为growthfactor(或者更合适的名称)。。。有趣的是名称是多么重要。@jahroy我完全同意。下面是容量参数/构造函数的用途。
public void setCharAt(int index, char ch) {
    if ((index < 0) || (index >= count))
        throw new StringIndexOutOfBoundsException(index);
    value[index] = ch;
}