4.1.3 StringBuilder/StringBuffer
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
1.特点
- 封装了char[]数组
- 是可变的字符序列
- 提供了一组可以对字符内容修改的方法
- 常用append()来代替字符串做字符串连接”+”
- 内部字符数组默认初始容量是16super(str.length() + 16);
- 如果大于16会尝试将扩容新数组大小原来的变成2倍+2容量如果还不够直接扩充到需要的容量大小。
intnewCapacity=value.length*2 + 2; - StringBuffer 1.0出道线程安全StringBuilder1.5出道线程不安全
2.常见方法
append()
3.练习测试字符串连接
package partThree;
/* 本类用于练习字符串的拼接*/
public class TestString3 {
public static void main(String[] args) {
//需求将26个字母拼接10000次
String s = "abcdefghijklmnopqrstuvwxyz";
//method1(s);
method2(s);
}
//使用方式一进行字符串的拼接
private static void method1(String s) {
//1.创建一个变量用来保存拼接后的结果
String result = "";
//5 给程序添加一个计时的功能
//5.1在循环开始前记录当前时间作为开始时间
long t1 = System.currentTimeMillis();
//2.执行循环10000次
for (int i = 0; i < 10000; i++) {
//每轮循环中拼接字符串
result = result + s ;
}
//5.2在循环结束后记录当前时间作为结束时间
long t2 = System.currentTimeMillis();
//4.循环结束后打印拼接的效果
System.out.println(result);
//5.3打印循环消耗的时间
System.out.println(t2-t1);
System.out.println(t2); //1631609138674 当前时间与协调世界时间1970年1月1日00点的毫秒差
}
//使用方式二进行字符串的拼接
private static void method2(String s) {
//1.创建工具类对象
StringBuffer sb = new StringBuffer();
StringBuilder sb2 = new StringBuilder();
//5.1在循环执行之前记录当前时间作为开始时间
long t1 = System.currentTimeMillis();
//2.让循环执行10000次进行拼接
for (int i = 0; i < 10000; i++) {
//3.在每一轮循环中使用工具类append()进行拼接
/* 我们常用的拼接方法就是StringBulder/StringBuffer中的append()*/
//sb.append(s);
sb2.append(s);
}
//5.2在循环执行之后记录当前时间作为结束时间
long t2 = System.currentTimeMillis();
//4.在循环结束后打印拼接效果
//System.out.println(sb);
System.out.println(sb2);
//6 求出拼接花费的时间
System.out.println(t2-t1);
}
}
StringBuffer比StringBulder效率要更好一点但是实际使用中效率更好的值比较有限所以使用哪个都行但都是比方法一效率要高很多
4.StringBuilder和StringBuffer的区别
- 在线程安全上 :
- StringBuffer是旧版本就提供的线程安全的。@since JDK1.0
- StringBuilder是jdk1.5后产生线程不安全的。@since 1.5
- 在执行效率上StringBuilder > StringBuffer > String
- 源码体现本质上都是在调用父类抽象类AbstractStringBuilder来干活只不过Buffer把代码加了同步关键字使得程序可以保证线程安全问题。