【Java常用类】1-4 StringBuffer, StringBuilder 和 StringJoiner
§1-4 StringBuffer, StringBuilder 和 StringJoiner
1-4.1 可变字符串
String 类型字符串具有不可变性,导致程序在运行过程中,不断产生新的字符串。这种做法很有可能会产生大量无用的垃圾字符串,同时效率较低。
因此,JDK 中提供了对 String 的增强类,StringBuffer 和 StringBuilder:
StringBuffer:可变长字符串,自 JDK 1.0 提供,运行效率慢,线程安全。适用于多线程,数据量较大的情况;StringBuilder:可变长字符串,自 JDK 5.0 提供,运行效率快,线程不安全。适用于单线程,数据量较大的情况;- 二者都具有容量,只要其中包含的字符序列长度不超过容量,就不需要分配新的内部缓冲区。若内部缓冲区溢出,它会自动变大;
- 通常应优先选择使用
StringBuilder,它为单线程使用而设计,支持相同的操作,且速度更快,因为它不执行同步。
实际上,StringBuffer 和 StringBuilder 所提供的 API 是完全兼容的。接下来以 StringBuilder 为例,介绍其最常用方法。
1-4.2 常用方法
1-4.2.1 构造方法
描述:用于构造一个字符串缓冲区。
| 构造方法 | 描述 |
|---|---|
StringBuffer()StringBuilder() |
构造一个其中没有字符且初始容量为 16 个字符的字符串缓冲区。 构造一个其中没有字符且初始容量为 16 各字符的字符串生成器。 |
StringBuffer(int capacity)StringBuilder(int capacity) |
构造一个其中没有字符和指定初始容量的字符串缓冲区。 构造一个其中没有字符的字符串生成器,初始容量由 capacity 指定。 |
StringBuffer(CharSequence seq)StringBuilder(CharSequence seq) |
构造一个字符串缓冲区,其中包含与指定的 CharSequence 相同的字符。构造一个字符串生成器,其中包含与指定的 CharSequence 相同的字符。 |
StringBuffer(String str)StringBuilder(String str) |
构造一个字符串缓冲区,初始化为指定字符串的内容。 构造一个初始化为指定字符串内容的字符串生成器。 |
示例:
StringBuilder sb = new StringBuilder();
1-4.2.2 append(Object obj);
描述:将指定内容的字符串表示形式附加到序列中,总是添加到序列的末尾。
该方法具有多个重载版本,支持接受任何类型的数据,是 StringBuffer 和 StringBuilder 最主要的操作之一。
示例:
StringBuilder sb = new StringBuilder();
sb.append("Hello, Java!");
System.out.println(sb);
得到
Hello, Java!
1-4.2.3 insert(int offset, Object obj);
描述:将指定参数的字符串表示形式插入此字符序列。
该方法具有多个重载版本,支持接收任何类型的数据,是 StringBuffer 和 StringBuilder 最主要的操作之一。
注意:插入时,实际上会在 offset - 1 处开始插入,即含头不含尾。
示例:
StringBuilder sb = new StringBuilder();
sb.append("Hello, Java!");
sb.insert(7,"world and ");
System.out.println(sb);
得到
Hello, world and Java!
1-4.2.4 delete(int start, int end);
描述:删除此序列的子字符串中的字符。
注意:删除时,实际上删除的字符串索引为 start 至 end - 1,删除长度 end - start,即含头不含尾(左闭右开)。
示例:
StringBuilder sb = new StringBuilder();
sb.append("Hello, world and Java!");
sb.delete(0,7);
System.out.println(sb);
得到
world and Java!
1-4.2.4 replace(int start, int end, String str);
描述:用指定的字符串中的字符替换此序列的子字符串的字符。
注意:替换时,注意替换长度为 end - start,含头不含尾。
示例:
StringBuilder sb = new StringBuilder();
sb.append("World and Java!");
sb.replace(0,5,"PHP");
System.out.println(sb);
得到
PHP and Java!
1-4.2.5 length();
描述:返回当前缓冲区中字符串长度(字符数)。
示例:
StringBuilder sb = new StringBuilder();
System.out.println(sb.length());
得到
0
StringBuilder 和 StringBuffer 没有 clear(); 方法,清空缓冲区字符需要:
sb.delete(0, sb.length());
1-4.2.6 capacity();
描述:返回当前容量。
注意:容量是可以存储的字符数(包括已经写入的字符),超过该数量将发生分配。
1-4.2.7 来自 String 类的方法
StringBuffer 和 StringBuilder 也支持 String 类中的一些方法,用法相同。
支持以下方法:charAt(), indexOf(), lastIndexOf(), substring()
1-4.3 效率
我们可以通过比较时间差,比较 String 与 StringBuilder 的效率。
public class EfficiencyTest {
public static void main(String[] args) {
//比较 String 与 StringBuffer 或 StringBuilder 速度
//获取开始时间
long start = System.currentTimeMillis();
String str = "";
for (int i = 0; i < 160000; i++) {
str += i;
}
System.out.println(str.length());
//获取结束时间
long end = System.currentTimeMillis();
System.out.println("用时:" + (end - start));
//使用 StringBuilder
StringBuilder sb = new StringBuilder();
start = System.currentTimeMillis();
for (int i = 0; i < 160000; i++) {
sb.append(i);
}
System.out.println(sb.length());
end = System.currentTimeMillis();
System.out.println("用时:" + (end - start));
}
}
运行得到
848890
用时:7054
848890
用时:5
可见,二者效率截然不同。
1-4.4 StringJoiner
StringJoiner 位于 java.util 包下,实现了 CharSequence 接口,自 JDK 8.0 后引入,是一种十分便利的创建含有分隔符、前后缀的字符串的方法。
StringJoiner 也是可变长字符串。
构造方法:
| 构造方法 | 描述 |
|---|---|
StringJoiner(CharSequence delimiter) |
创建一个没有字符,没有前后缀,仅有分隔符的 StringJoiner 对象 |
StringJoiner(CharSequence delimiter, CharSequence prefix, CharSequence suffix) |
创建一个没有字符,具有前后缀和分隔符的 StringJoiner 对象 |
常用方法:
| 方法 | 描述 |
|---|---|
StringJoiner add(CharSequence newElement) |
将给定的 CharSequence 值的副本作为 StringJoiner 的下一个元素 |
int length() |
返回实际生成字符串的总长度 |
String toString() |
返回字符串 |
注意:
add()方法参数只接受字符串;StringJoiner类并不支持诸如删除、查找、替换等操作;
示例:
//StringJoiner JDK 8.0 后支持,方便连接字符串
StringJoiner sj1 = new StringJoiner(", ");
StringJoiner sj2 = new StringJoiner(", ", "[", "]");
int[] arr = {1,2,3,4,5};
//add()方法,只接受字符串
for (int j : arr) {
sj1.add(String.valueOf(j));
sj2.add(String.valueOf(j));
}
System.out.println(sj1);
System.out.println(sj2);
运行得到
1, 2, 3, 4, 5
[1, 2, 3, 4, 5]
同时,StringJoiner 也具有比 String 更高的效率。
浙公网安备 33010602011771号