非零基础自学Java (老师:韩顺平)
✈【【零基础 快速学Java】韩顺平 零基础30天学会Java】
第13章 常用类
文章目录
- 非零基础自学Java (老师:韩顺平)
- 第13章 常用类
- 13.6 StringBuilder类
- 13.6.1 基本介绍
- 13.6.2 StringBuilder常用方法
- 13.6.3 String、StringBuffer 和 StringBuilder 的比较
- 13.6.4 String、StringBuffer 和 StringBuilder 的效率测试
- 13.6.5 String、StringBuffer 和 StringBuilder 的选择
13.6 StringBuilder类
13.6.1 基本介绍
一个可变的字符序列。
此类提供一个与 StringBuffer兼容的API,但不保证同步(StringBuilder 不是线程安全)。
该类被设计用作 StringBuffer的一个简易替换,用在字符串缓冲区被单个线程使用的时候。
如果可能,建议优先采用该类因为在大多数实现中,它比 StringBuffer要快。
在StringBuilder 上的主要操作是append 和 insert方法,可重载这些方法,以接受任意类型的数据。
【举个栗子】
package com.dingjiaxiong.stringbuilder_;/*** ClassName: StringBuilder01* date: 2022/9/4 16:52** @author DingJiaxiong*/public class StringBuilder01 {public static void main(String[] args) {//韩老师解读//老韩解读//1. StringBuilder 继承 AbstractStringBuilder 类//2. 实现了 Serializable ,说明StringBuilder对象是可以串行化(对象可以网络传输,可以保存到文件)//3. StringBuilder 是final类, 不能被继承//4. StringBuilder 对象字符序列仍然是存放在其父类 AbstractStringBuilder的 char[] value;// 因此,字符序列是堆中//5. StringBuilder 的方法,没有做互斥的处理,即没有synchronized 关键字,因此在单线程的情况下使用// StringBuilderStringBuilder stringBuilder = new StringBuilder();}
}
13.6.2 StringBuilder常用方法
StringBuilder 和StringBuffer均代表可变的字符序列,方法是一样的,所以使用和StringBuffer一样
略。
可参考官方文档。
13.6.3 String、StringBuffer 和 StringBuilder 的比较
- StringBuilder和StringBuffer非常类似,均代表可变的字符序列,而且方法也一样
- String:不可变字符序列,效率低,但是复用率高。
- StringBuffer:可变字符序列、效率较高(增删)、线程安全
- StringBuilder:可变字符序列、效率最高、线程不安全
- String使用注意说明:
- string s=“a”;//创建了一个字符串
- s += “b”;//实际上原来的"a"字符串对象已经丢弃了,现在又产生了一个字符串s+“b”(也就是"ab”)。如果多次执行这些改变串内容的操作,会导致大量副本字符串对象存留在内存中,降低效率。如果这样的操作放到循环中,会极大影响程序的性能
- 结论:如果要对String做大量修改,不要使用String
13.6.4 String、StringBuffer 和 StringBuilder 的效率测试
结论:StringBuilder > StringBuffer > String
【举个栗子】
package com.dingjiaxiong.stringbuilder_;/*** ClassName: StringVsStringBufferVsStringBuilder* date: 2022/9/4 16:57** @author DingJiaxiong*/public class StringVsStringBufferVsStringBuilder {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)); //StringBuffer拼接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)); //StringBuilder拼接80000次}endTime = System.currentTimeMillis();System.out.println("StringBuilder的执行时间为:" + (endTime - startTime));String text = "";startTime = System.currentTimeMillis();for (int i = 0; i < 80000; i++) {text = text + i; //StringBuilder拼接80000次}endTime = System.currentTimeMillis();System.out.println("String的执行时间为:" + (endTime - startTime));}
}
运行结果
13.6.5 String、StringBuffer 和 StringBuilder 的选择
- 如果字符串存在大量的修改操作,一般使用 StringBuffer 或StringBuilder
- 如果字符串存在大量的修改操作,并在单线程的情况,使用 StringBuilder
- 如果字符串存在大量的修改操作,并在多线程的情况,使用 StringBuffer
- 如果字符串很少修改,被多个对象引用,使用String, 比如配置信息等