Java StringBuilder

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

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