Java StringBuilder
Java中的StringBuilder是可变的字符序列。 StringBuilder类提供的API与StringBuffer兼容,但有明显的区别,而StringBuilder不能保证同步。
当单个线程使用字符串缓冲区时,建议使用StringBuilder而不是StringBuffer,因为这样会更快,因为没有同步开销。
为什么需要StringBuilder类
我们可能想知道,当String类已经具有广泛的API时,为什么需要StringBuilder或者StringBuffer类。
在Java中的String文章中,我们已经看到String对象是不可变的,并且在创建它们之后不能更改它们的值。由于具有这种不变性属性,因此在使用诸如连接之类的String修改方法时,实际发生的情况是创建并返回了一个包含操作结果的新String。如果对String进行多次修改,可能会导致创建大量中间String对象,这反过来又意味着将更多内存用于这些中间对象。
使用StringBuilder或者StringBuffer可以避免创建多个对象的问题,因为这些类是可变的。
关于Java StringBuilder的要点
有关StringBuilder类的一些要点。
- Java中的StringBuilder提供了String类的许多功能,但有一个明显的偏差,即StringBuilder是可变的。
- StringBuilder具有与StringBuffer兼容的API,除了一个设计差异之外,StringBuilder不同步,因此它不像StrinBuffer那样是线程安全的。
- 每个StringBuilder都会创建一个容量。只要字符串生成器中包含的字符序列的长度不超过容量,就不必分配新的内部缓冲区。如果内部缓冲区溢出,则会自动变大。
Java StringBuilder构造函数
StringBuilder类中有四个构造函数。
- StringBuilder()–构造一个空字符串生成器,初始容量为16个字符。
StringBuilder sb = new StringBuilder();
- StringBuilder(int capacity)–构造一个字符串生成器,其中不包含任何字符,并且初始容量由Capacity参数指定。
StringBuilder sb = new StringBuilder(30);
- StringBuilder(CharSequence seq)–构造一个字符串生成器,其中包含与指定CharSequence相同的字符。这里的CharSequence是由CharBuffer,Segment,String,StringBuffer,StringBuilder实现的接口。
- StringBuilder(String str)–构造一个字符串生成器,初始化为指定字符串的内容。
StringBuilder sb = new StringBuilder("Hello");
Java StringBuilder方法示例
追加方法
StringBuilder类中的append方法已重载,以接受任何类型的数据。此方法将给定数据类型的字符串表示形式添加到现有缓冲区。 append方法始终将这些字符添加到缓冲区的末尾。
public class StringLiteral { public static void main(String[] args) { StringBuilder sb = new StringBuilder("Hello"); sb.append(" "); //chaining several appends sb.append("World").append(" ").append(123); System.out.println("Appended String- " + sb.toString()); } }
输出:
Appended String- Hello World 123
从示例中可以看到,append与String和int一起用作参数,因为这些数据类型已重载。我们也可以像示例中那样链接多个append方法。
插入方法
在StringBuilder类中,insert方法也被重载,以接受任何类型的数据。此方法用于将给定数据类型的字符串表示形式插入现有缓冲区。 insert方法在指定点添加字符。
insert方法使用两个参数,第一个参数是整数,指示要在缓冲区中插入字符的位置,第二个参数是要插入的文本。
public class StringLiteral { public static void main(String[] args) { StringBuilder sb = new StringBuilder("Hello"); sb.insert(5, " World"); System.out.println("String after insert- " + sb); } }
输出:
String after insert- Hello World
长度和容量方法
- Capacity()–返回StringBuilder的当前容量。
- length()–返回此序列中的字符数。
public class StringLiteral { public static void main(String[] args) { StringBuilder sb = new StringBuilder(30); sb.append("Hello"); System.out.println("Capacity of StringBuilder- " + sb.capacity()); System.out.println("Length of StringBuilder- " + sb.length()); } }
输出:
Capacity of StringBuilder- 30 Length of StringBuilder- 5
在这里我们可以看到创建的StringBuilder的容量为30,因此容量显示为30,其中缓冲区中的字符数为5,因此长度显示为5.
反向法
- reverse()–撤消现有的StringBuilder。
public class StringLiteral { public static void main(String[] args) { StringBuilder sb = new StringBuilder("Hello"); System.out.println("Reversed- " + sb.reverse()); } }
输出:
Reversed- olleH
替换方法
- replace(int start,int end,String str)–用指定String中的字符替换此序列的子字符串中的字符(从start到end-1)。
public class StringLiteral { public static void main(String[] args) { StringBuilder sb = new StringBuilder("Hello"); sb.replace(3, 5, "ena"); System.out.println("String- " + sb); } }
输出:
String- Helena
delete和deleteCharAt方法
- delete(int start,int end)–删除此序列的子字符串中的字符。 start表示开始索引包括在内,而end表示结束索引是排除的。
- deleteCharAt(int index)–删除此序列中指定位置的char。
public class StringLiteral { public static void main(String[] args) { StringBuilder sb = new StringBuilder("Hello"); sb.delete(1, 3); System.out.println("After deletion- " + sb); System.out.println("Length of StringBuilder- " + sb.length()); } }
输出:
After deletion- Hlo Length of StringBuilder- 3
public class StringLiteral { public static void main(String[] args) { StringBuilder sb = new StringBuilder("Hello"); sb.deleteCharAt(4); System.out.println("After deletion- " + sb); System.out.println("Length of StringBuilder- " + sb.length()); } }
输出:
After deletion- Hell Length of StringBuilder- 4