Java StringBuilder setLength方法是否将\0冗余分配给其char[]值数组?
我正在研究Java StringBuilder 如果新长度更大,它会将新“附加”的数组索引设置为“\0”:Java StringBuilder setLength方法是否将\0冗余分配给其char[]值数组?,java,arrays,string,stringbuilder,Java,Arrays,String,Stringbuilder,我正在研究Java StringBuilder 如果新长度更大,它会将新“附加”的数组索引设置为“\0”: public void setLength(int newLength) { if (newLength < 0) throw new StringIndexOutOfBoundsException(newLength); if (newLength > value.length) expandCapacity(newLe
public void setLength(int newLength) {
if (newLength < 0)
throw new StringIndexOutOfBoundsException(newLength);
if (newLength > value.length)
expandCapacity(newLength);
if (count < newLength) {
for (; count < newLength; count++)
value[count] = '\0';
} else {
count = newLength;
}
}
数组中的组件被初始化为其默认值。对于char,这是'\u0000',据我所知,它是'\0'的unicode等价物
此外,缔约国:
如果newLength参数大于或等于当前
长度,追加足够的空字符('\u0000'),以便
length成为newLength参数
但可以直接访问此数组的长度,而无需为其组件赋值:
char[] array = new char[10];
System.out.println(array.length); // prints "10"
那么,setLength中的for循环是多余的吗?当我们想要重用
StringBuilder
时,它是必要的
假设我们在StringBuilder
if (count < newLength) {
for (; count < newLength; count++)
value[count] = '\0';
}
您在jdk6和java8中提到的代码是不同的。for循环是附加\0s。@JawadLeWywadi OP从JLS中引用的文档表明这种附加是不必要的,因为
\0
是char
s的默认值。
if (count < newLength) {
for (; count < newLength; count++)
value[count] = '\0';
}
StringBuilder builder = new StringBuilder("test");
builder.setLength(0); //the `value` still keeps "test", `count` is 0
System.out.println(builder.toString()); //print empty
builder.setLength(50); //side effect will happen here, "test" is not removed because expandCapacity still keeps the original value
System.out.println(builder.toString()); // will print test