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

时间:2017-06-16 02:39:21

标签: java arrays string stringbuilder

我正在研究Java StringBuilder' setLength method

如果新长度较大,则设置新的"追加"数组索引为' \ 0':

nil

这是不必要的吗?在expandCapacity(newLength)中,Arrays.copyOf方法用于创建一个大小为newLength的新char []数组:

$(document).ready(function(){

$(document).scroll(function(e){

e.preventDefault();

$("#mainContainer").css("transform", "translateX(-100vw)");

})


})

数组中的组件初始化为其默认值的Java language specification states。对于char,这是' \ u0000'据我所知,它是' \ 0'。

的unicode

此外,StringBuilder setLength documentation州:

  

如果newLength参数大于或等于当前值   长度,附加足够的空字符(' \ u0000')以便这样做   length成为newLength的论点。

但是可以直接访问此数组的长度,而无需为其组件赋值:

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;
     }
 }

那么,setLength中的for循环是多余的吗?

1 个答案:

答案 0 :(得分:1)

当我们想要重用StringBuilder时,必要

假设我们在StringBuilder

中删除了此代码
  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

您提到的代码在jdk6中,在java8中是不同的。