我正在研究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循环是多余的吗?
答案 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中是不同的。