Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.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 setLength方法是否将\0冗余分配给其char[]值数组?_Java_Arrays_String_Stringbuilder - Fatal编程技术网

Java StringBuilder setLength方法是否将\0冗余分配给其char[]值数组?

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

我正在研究Java StringBuilder

如果新长度更大,它会将新“附加”的数组索引设置为“\0”:

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