Java StringBuffer
Java中的StringBuffer是线程安全的可变字符序列,因此使用StringBuffer类可以创建可修改的String对象。
在Java中的String一文中,我们已经看到String对象是不可变的,即String是常量;它们的值在创建后无法更改。由于具有这种不变性属性,因此在使用诸如连接之类的String修改方法时,实际发生的情况是创建并返回了一个包含操作结果的新String。如果对String进行多次修改,可能会导致创建大量中间String对象,这反过来又意味着将更多内存用于这些中间对象。
使用StringBuffer对象可以避免创建多个可变对象的问题。毫不奇怪,对StringBuffer的主要操作是append和insert方法。
关于Java StringBuffer的要点
有关StringBuffer类的一些要点。
Java中的StringBuffer提供了String类的许多功能,但有一个明显的偏差,即StringBuffer是可变的。
StringBuffer也是线程安全的,因此StringBuffer对象可以被多个线程安全地使用。 StringBuffer类的方法在必要时进行同步。
每个StringBuffer都会创建一个容量。只要字符串缓冲区中包含的字符序列的长度不超过容量,就不必分配新的内部缓冲区数组。如果内部缓冲区溢出,则会自动变大。
还提供Java 5及更高版本的StringBuilder类,该类等效于StringBuffer类,但设计供单个线程使用。 StringBuilder更快,因为它不执行同步。
Java StringBuffer构造函数
StringBuffer类中有四个构造函数。
- StringBuffer()–构造一个不带字符且初始容量为16个字符的字符串缓冲区。
StringBuffer sb = new StringBuffer();
- StringBuffer(int capacity)–构造一个字符串缓冲区,其中不包含任何字符,并且具有指定的初始容量。
StringBuffer sb = new StringBuffer(30);
StringBuffer(CharSequence seq)–构造一个字符串缓冲区,其中包含与指定CharSequence相同的字符。这里的CharSequence是由CharBuffer,Segment,String,StringBuffer,StringBuilder实现的接口。
StringBuffer(String str)–构造一个初始化为指定字符串内容的字符串缓冲区。
StringBuffer sb = new StringBuffer("Hello");
Java StringBuffer方法示例
追加方法
append方法已重载,以接受任何类型的数据。此方法将给定数据类型的字符串表示形式添加到现有缓冲区。 append方法始终将这些字符添加到缓冲区的末尾。
public class StringLiteral { public static void main(String[] args) { StringBuffer sb = new StringBuffer("Hello"); sb.append(" "); sb.append("World").append(" ").append(123); System.out.println("Appended String- " + sb.toString()); } }
输出:
Appended String- Hello World 123
从示例中可以看到,append与String一起用作参数,并且与int一起用作参数,因为对于这些数据类型,它被重载。我们还可以像在此代码行中那样完成添加方法的链接:
sb.append("World").append(" ").append(123)
使用append方法,我们还可以检查StringString是可变的,因为StringBuffer是可变的。在示例中,创建了一个StringBuffer对象,然后将值添加到该对象,并将返回的引用存储在另一个StringBuffer中。
创建字符串并向其添加值的方式相同,返回的字符串也被另一个字符串引用。
在检查两个StringBuffer引用的相等性时,我们可以看到两者相同,而对于String而言,则不同。
public class StringLiteral { public static void main(String[] args) { // With StringBuffer System.out.println("StringBuffer..."); StringBuffer sb = new StringBuffer("Hello"); sb.append(" "); StringBuffer newsb = sb.append("World").append(" ").append(123); if (sb == newsb) { System.out.println("Reference is same"); }else { System.out.println("Reference is different"); } // With String System.out.println("String..."); String str = "Hello"; String newstr = str.concat(" ").concat("World").concat(" ").concat("123"); if (str == newstr) { System.out.println("Reference is same"); }else { System.out.println("Reference is different"); } } }
输出:
StringBuffer... Reference is same String... Reference is different
插入方法
insert方法已重载,以接受任何类型的数据。此方法用于将给定数据类型的字符串表示形式插入现有缓冲区。 insert方法在指定点添加字符。
insert方法使用两个参数,第一个参数是整数,指示要在缓冲区中插入字符的位置,第二个参数是要插入的文本。
public class StringLiteral { public static void main(String[] args) { StringBuffer sb = new StringBuffer("Knp"); sb.insert(3, "Code"); System.out.println("String after insert- " + sb); } }
输出:
String after insert- theitroad
长度和容量方法
Capacity()–返回StringBuffer的当前容量。
length()–返回此序列中的字符数。
public class StringLiteral { public static void main(String[] args) { StringBuffer sb = new StringBuffer(30); sb.append("Hello"); System.out.println("Capacity of StringBuffer- " + sb.capacity()); System.out.println("Length of StringBuffer- " + sb.length()); } }
输出:
Capacity of StringBuffer- 30 Length of StringBuffer- 5
如我们所见,创建的StringBuffer的容量为30,因此容量显示为30,其中缓冲区中的字符数为5,因此长度显示为5.
delete和deleteCharAt方法
delete(int start,int end)–删除此序列的子字符串中的字符。 start表示开始索引包括在内,而end表示结束索引是排除的。
deleteCharAt(int index)–删除此序列中指定位置的char。
public class StringLiteral { public static void main(String[] args) { StringBuffer sb = new StringBuffer("Hello"); sb.delete(1, 4); System.out.println("After deletion- " + sb); System.out.println("Length of StringBuffer- " + sb.length()); } }
输出:
After deletion- Ho Length of StringBuffer- 2
public class StringLiteral { public static void main(String[] args) { StringBuffer sb = new StringBuffer("Hello"); sb.deleteCharAt(4); System.out.println("After deletion- " + sb); System.out.println("Length of StringBuffer- " + sb.length()); } }
输出:
After deletion- Hell Length of StringBuffer- 4
Java StringBuffer反向方法
reverse()–反转现有的StringBuffer。
public class StringLiteral { public static void main(String[] args) { StringBuffer sb = new StringBuffer("Hello"); System.out.println("Reversed- " + sb.reverse()); } }
输出:
Reversed- olleH
Java StringBuffer替换方法
replace(int start,int end,String str)–用指定String中的字符替换此序列的子字符串中的字符(从start到end-1)。
public class StringLiteral { public static void main(String[] args) { StringBuffer sb = new StringBuffer("Hello"); sb.replace(3, 5, "ena"); System.out.println("String- " + sb); } }
输出:
String- Helena