【Java常用类】1-4 StringBuffer, StringBuilder 和 StringJoiner

§1-4 StringBuffer, StringBuilderStringJoiner

1-4.1 可变字符串

String 类型字符串具有不可变性,导致程序在运行过程中,不断产生新的字符串。这种做法很有可能会产生大量无用的垃圾字符串,同时效率较低。

因此,JDK 中提供了对 String 的增强类,StringBufferStringBuilder

  • StringBuffer:可变长字符串,自 JDK 1.0 提供,运行效率慢,线程安全。适用于多线程,数据量较大的情况;
  • StringBuilder:可变长字符串,自 JDK 5.0 提供,运行效率快,线程不安全。适用于单线程,数据量较大的情况;
  • 二者都具有容量,只要其中包含的字符序列长度不超过容量,就不需要分配新的内部缓冲区。若内部缓冲区溢出,它会自动变大;
  • 通常应优先选择使用 StringBuilder,它为单线程使用而设计,支持相同的操作,且速度更快,因为它不执行同步。

实际上,StringBufferStringBuilder 所提供的 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);

描述:将指定内容的字符串表示形式附加到序列中,总是添加到序列的末尾。

该方法具有多个重载版本,支持接受任何类型的数据,是 StringBufferStringBuilder 最主要的操作之一。

示例

StringBuilder sb = new StringBuilder();
sb.append("Hello, Java!");
System.out.println(sb);

得到

Hello, Java!

1-4.2.3 insert(int offset, Object obj);

描述:将指定参数的字符串表示形式插入此字符序列。

该方法具有多个重载版本,支持接收任何类型的数据,是 StringBufferStringBuilder 最主要的操作之一。

注意:插入时,实际上会在 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);

描述:删除此序列的子字符串中的字符。

注意:删除时,实际上删除的字符串索引为 startend - 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

StringBuilderStringBuffer 没有 clear(); 方法,清空缓冲区字符需要:

sb.delete(0, sb.length());

1-4.2.6 capacity();

描述:返回当前容量。

注意:容量是可以存储的字符数(包括已经写入的字符),超过该数量将发生分配。

1-4.2.7 来自 String 类的方法

StringBufferStringBuilder 也支持 String 类中的一些方法,用法相同。

支持以下方法:charAt(), indexOf(), lastIndexOf(), substring()

1-4.3 效率

我们可以通过比较时间差,比较 StringStringBuilder 的效率。

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() 返回字符串

注意

  1. add() 方法参数只接受字符串;
  2. 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 更高的效率。

posted @ 2023-07-19 23:29  Zebt  阅读(134)  评论(0)    收藏  举报