Java StringBuffer

时间:2020-01-09 10:34:52  来源:igfitidea点击:

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