StringBuilder类
介绍
1.一个可变的字符序列。此类提供一个与StringBuffer兼容的API,但不保证同步。StringBuilder 类被设计用作StringBuffer类的一个简易替换,用在字符串缓冲区被单个线程使用 建议单线程优先使用StringBuilder 类,因为他比StringBuffer块
2.在StringBuilder 上的主要操作就是append和insert方法,可重载这些方法接受任意类型
String、StringBuffer和 StringBuilder 的比较
1.StringBuffer和 StringBuilder非常类似,均代表可变的字符序列,而且方法也一样
2.String:不可变字符序列,效率低,但是复用率高
3.StringBuffer:可变字符串序列,效率较高,线程安全
4.StringBuilder:可变字符序列,效率最高,线程不安全
5.String使用注意说明:
string s=“a”;//创建了一个字符串
s += “b”;//实际上原来的"a"字符串对象已经丢弃了,现在又产生了一个字符串s+“b”(也就是"ab”)。如果多次执行这些改变串内容的操作,会导致大量副本字符串对象存留在内存中,降低效率。如果这样的操作放到循环中,会极大影响程序的性能=>结论:如果我们对String做大量修改,不要使用String
String、StringBuffer 和 StringBuilder 的效率测试
package string;public class StringBuilder01 {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++) {buffer.append(String.valueOf(i));//StrigBuffer拼接80000次}endTime = System.currentTimeMillis();System.out.println("StringBuffer的执行时间是:" + (endTime - startTime));StringBuilder builder =new StringBuilder("");startTime = System.currentTimeMillis();for (int i = 0; i < 80000; i++) {builder.append(String.valueOf(i));//StrigBuilder拼接80000次}endTime = System.currentTimeMillis();System.out.println("StringBuilder的执行时间是:" + (endTime - startTime));String text = "";startTime = System.currentTimeMillis();for (int i = 0; i < 80000; i++) {text += i;}endTime = System.currentTimeMillis();System.out.println("String的执行时间是:" + (endTime - startTime));}
}
编译结果
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lWS6s9gp-1682322276986)(C:\Users\22014\AppData\Roaming\Typora\typora-user-images\image-20230424154139338.png)]
结论
效率 StringBuilder > StringBuffer > String
String、StringBuffer和StringBuilder的选择
1.如果字符串存在大量的修改操作,一般使用 StringBuffer 或StringBuilder
2.如果字符串存在大量的修改操作,并在单线程的情况,使用 StringBuilder
3.如果字符串存在大量的修改操作,并在多线程的情况,使用 StringBuffer
4.如果我们字符串很少修改,被多个对象引用,使用String,比如配置信息等StringBuilder 的方法使用和StringBuffer一样