HOWTO · Java
在 Java 中清除 StringBuilder
本文展示了如何在 Java 中清除或清空 StringBuilder。
本页内容
若要在保留同一对象的同时清空 StringBuilder,请调用 setLength(0)。若要让变量指向一个全新的 builder,请为它赋值一个新的 StringBuilder;这不会改变其他引用所指向的旧对象。若要删除指定范围,请使用 delete(start, end);要清空全部内容,则可使用整个范围。
使用 setLength(0) 清空 StringBuilder
setLength(0) 会将 builder 的逻辑长度设为 0。变量仍指向同一个 StringBuilder,因此,指向该对象的其他引用也会看到重置后的状态。当你想重复使用这个 builder 来存储另一个值时,这种做法很实用。
运行下面的示例:
本节中的代码以及显示的标签或输出仍为英文。
public class Main {
public static void main(String[] args) {
StringBuilder builder = new StringBuilder("Hello");
builder.setLength(0);
builder.append("Java");
System.out.println(builder);
}
}
Java
重置后,追加的文本就是 builder 当前的内容。输出块显示 Java;其中的文本保持英文。容量与长度是不同的属性;此操作会重置逻辑内容,但不保证带来特定的内存或性能收益。
通过赋值新实例来清空 StringBuilder
赋值 new StringBuilder() 会改变变量所指向的对象。它不会清空或修改原来的对象,因此,其他别名仍会指向原对象及其现有内容。如果你希望这个变量改用一个独立的 builder,同时让其他引用保留旧值,可以选择这种做法。
本节中的代码以及显示的标签或输出仍为英文。
public class Main {
public static void main(String[] args) {
StringBuilder current = new StringBuilder("draft");
StringBuilder alias = current;
current = new StringBuilder();
current.append("final");
System.out.println(current);
System.out.println(alias);
}
}
final
draft
在这里,current 指向新的 builder,而 alias 仍指向包含 draft 的 builder。输出块依次显示 final 和 draft;这些文本保持英文。如果你希望所有引用都看到同一次重置,则应改为使用 setLength(0) 修改原对象。
使用 delete() 删除全部或部分内容
delete(start, end) 会删除从 start 索引(包含该位置)开始,到 end 索引(不包含该位置)为止的字符。例如,对 "abcdef" 删除索引 1 到 3 的内容,会移除 "bcd",留下 "aef"。因此,只需删除其中一段内容时,delete() 很有用。
若要使用 delete() 清空当前全部内容,请将范围设为从 0 到 builder 当前的长度:
本节中的代码以及显示的标签或输出仍为英文。
public class Main {
public static void main(String[] args) {
StringBuilder builder = new StringBuilder("abcdef");
builder.delete(1, 4);
System.out.println(builder);
builder.delete(0, builder.length());
System.out.println(builder.length());
}
}
aef
0
第一次调用只会删除指定范围,输出为 aef;第二次调用会在删除前计算结束索引,并删除当时存在的全部内容,输出长度为 0。输出块中的 aef 保持原样,数字 0 也照原样显示。如果内容长度可能变化,使用当前长度就不必硬编码结束位置。
如何选择清空或替换 StringBuilder
如果要重置现有对象,请使用 setLength(0),尤其是在其他代码也持有该对象引用时。如果只想让当前变量指向一个全新的对象,同时让别名保留旧内容,请创建一个新的 StringBuilder。如果只需删除一部分内容,请使用 delete(start, end);delete(0, builder.length()) 则通过删除整个范围来清空内容。
这些操作对对象身份的影响各不相同。重置或删除内容,会改变该对象所有引用所看到的内容;重新赋值只会改变被赋值的变量。根据哪些引用应该看到变化来选择操作,然后按需追加内容或构建下一个值。