一:StringBuilder类
- 一个可变的字符序列。此类提供一个与StringBuffer 兼容的API,但不保证同步(StringBuilder不是线程安全)。该类被设计用作 StringBuffer的一个简易替换,用在字符串缓冲区被单个线程使用的时候。如果可能,建议优先采用该类因为在大多数实现中,它比 StringBuffer要快。
- 在StringBuilder上的主要操作是append和insert方法,可重载这些方法,以接受任意类型的数据。
:::info
和StringBuffer相比StringBuilder的方法没有没有做互斥的处理,即没有synchronized(同步) 关键字。
:::
:::info
继承关系和StringBuffer是一样的
:::
public class Test1 {
public static void main(String[] args) {
//1. StringBuilder 继承 AbstractStringBuilder 类
//2. 实现了 Serializable ,
// 说明 StringBuilder 对象是可以串行化(对象可以网络传输,可以保存到文件)
//3. StringBuilder 是 final 类, 不能被继承
//4. StringBuilder 对象字符序列仍然是存放在其父类
// AbstractStringBuilder 的 char[] value;
//5. StringBuilder 的方法,没有做互斥的处理,即没有synchronized 关键字,
// 因此在单线程的情况下使用
StringBuilder stringBuilder = new StringBuilder();
}
}
二:String、StringBuffer 和 StringBuilder 的比较
- StringBuilder 和 StringBuffer非常类似,均代表可变的字符序列,而且方法也一样
- String:不可变字符序列,效率低,但是复用率高。
- StringBuffer:可变字符序列、效率较高(增删)、线程安全,看源码StringBuilder:可变字符序列、效率最高、线程不安全
- StringBuilder:可变字符序列、效率最高、线程不安全
- String使用注意说明:
- string s=”a”;//创建了一个字符串
- s += “b”;//实际上原来的”a”字符串对象已经丢弃了,现在又产生了一个字符串s+”b”(也就是”ab”)。如果多次执行这些改变串内容的操作,会导致大量副本字符串对象存留在内存中,降低效率。如果这样的操作放到循环中,会极大影响程序的性能
- =>结论:如果我们对String做大量修改,不要使用String ```java package Date0823.Test03;
/**
- 作者:sakura
日期:2022年08月24日 21:36 */ public class Test1 { public static void main(String[] args) {
long startTime = 0L;
long endTime = 0L;
StringBuffer buffer = new StringBuffer("");
startTime = System.currentTimeMillis();
for (int i = 0; i < 80000; i++) {
//StringBuffer 拼接 20000 次
buffer.append(String.valueOf(i));
}
endTime = System.currentTimeMillis();
System.out.println("StringBuffer 的执行时间:" + (endTime - startTime));
StringBuilder builder = new StringBuilder("");
startTime = System.currentTimeMillis();
for (int i = 0; i < 80000; i++) {
//StringBuilder 拼接 20000 次
builder.append(String.valueOf(i));
}
endTime = System.currentTimeMillis();
System.out.println("StringBuilder 的执行时间:" + (endTime - startTime));
String text = "";
startTime = System.currentTimeMillis();
for (int i = 0; i < 80000; i++) {
//String 拼接 20000
text = text + i;
}
endTime = System.currentTimeMillis();
System.out.println("String 的执行时间:" + (endTime - startTime));
}
}
```