据我所知,StringBuilder对象包含一个字符数组。当我们构造一个StringBuilder对象时,我们指定一个容量(或直接提供一个字符串)。 我假设这意味着还在内部创建了指定容量长度(或默认容量)的数组。
如果我然后追加或插入一个长度比容量短的字符串,该数组的(剩余?)空插槽中有什么?是空(\ u0000)吗?
如果它为null,当newLength参数大于实际字符串的长度时,setLength(newLength)会发生什么事也会让我感到困惑。在java API文档中,声明“如果newLength参数大于或等于当前长度,则足够的空字符(\ u0000)将附加到字符串构建器,以便”length“成为newLength参数。”我的问题是,那里还没有空字符吗?
赞赏任何澄清(:
再次编辑:标题中的*表示
答案 0 :(得分:0)
我的问题是,那里是否有空字符?
不,当你从StringBuilder收缩或删除字符时,它不必填充不再与nul
字符一起使用的字符。
答案 1 :(得分:0)
根据SpringBuilder
的javadoc:
If the newLength argument is greater than or equal to the current length, sufficient null characters ('\u0000') are appended so that length becomes the newLength argument.
事实上,当StringBuilder存储char
个字符数组时,此数组的长度为newLength
。
如果您当前的StringBuilder
长度为10,并且您将此长度设置为12,那么缺少的空格将由null
填充(对于char
类型,这是\u0000
)。
所以最后两个字符将为空。
StringBuilder sb = new StringBuilder();
sb.append('x');
System.out.println(sb.length()); // prints 1
sb.setLength(2);
System.out.println(sb.length()); // prints 2
答案 2 :(得分:0)
假设StringBuilder有一个长度为' n'和' k'为了新的长度。
我的理解如下:
答案 3 :(得分:0)
StringBuilder添加了空字符。 setLength
执行以下操作:
首先,使用Arrays
副本。
Arrays.copyOf(value, newLength)
最后,在最后一个字符上设置\ 0:
if (count < newLength) {
for (; count < newLength; count++)
value[count] = '\0';
答案 4 :(得分:0)
如果你查看字符串生成器的setLength方法的代码,它会执行以下操作
确保新长度为正,否则抛出 的StringIndexOutOfBoundsException
确保满足最小容量,例如,如果最小容量 是10,你将长度改为20,创建一个新的数组 实际数组的内容被复制到这个新数组,然后它 替换字符串生成器的旧数组。 如果长度减少,则不会创建新阵列
检查新数组的长度是否大于之前的长度 数组,如果是,则填充该数组的额外索引 空字符
将新数组的长度设置为当前长度(如果新长度小于前一个长度,则会丢弃额外字符,简而言之,数组不会被更改或替换为长度数组的标记更改为新的长度)
答案 5 :(得分:0)
执行这些命令集以了解setLength()
方法
StringBuilder str = new StringBuilder("tutorials");
System.out.println("string = " + str);
// length of StringBuilder
System.out.println("length = " + str.length());
// set the length of StringBuilder to 5
str.setLength(5);
// print new StringBuilder value after changing length
System.out.println("After set, string = " + str);
// length of StringBuilder after changing length
System.out.println("length = " + str.length());
<强>输出:强>
string = tutorials
length = 9
After set, string = tutor
length = 5