java-常用类之StringBuffer&StringBuilder

1. StringBuffer&StringBuilder

​ 在前面已经对String有过一定了解,String是一种定长字符串的表现形式,内部是通过char数组实现;String优势在于使用时速度较快,但是缺点是内容可改变,一经定义则无法修改,所以String类型对象不适合做大量一些字符串拼接运算。

String s1 = "hello";
String s2 = "world";
Stringt s3 = s1 + s2; //new String("hello"+"world");

对于String存在的问题(长度不可变,拼接效率低),因此JDK中提供了用于实现字符串大量拼接运算的StringBufferStringBuilder类。

1.1. StringBuffer

StringBuffer是一个线程安全的可变字符串序列实现(实现了CharSequence接口),内部提供了一系列方法用于修改,删除字符串中的指定子串,其中以append,insert居多:

  • append:追加,在已知字符串的末尾追加新的子串
  • insert:插入,在已知字符串的指定位置插入新的子串

无论如何追加,修改,对象的地址始终不会变化

常用构造器:

  • StringBuffer():创建一个默认为空字符串的StringBuffer对象
  • StringBuffer(String s):创建一个以参数为字符串为初始值的StringBuffer对象
  • StringBuffer(CharSequence c):创建一个以CharSequence实现类对象为初始值的StringBuffer对象
  • StringBuffer(int initCapacity):创建一个指定初始缓冲区的StringBuffer对象

常用方法

  • append(...):向当前字符串对象末尾追加子串(任意数据类型)
  • insert(...):向当前字符串的指定位置插入子串(任意数据类型)
  • length():当前字符串对象中实际存储的字符个数
  • capacity():字符串对象中字符数组的总容量
  • reverse():将当前字符串内容反转
String s = "123";
StringBuffer sb = new StringBuffer(s);
//链式编程(链条)
sb.append(10)
    .append(true)
    .append(3.14)
    .append("hello")
    .insert(0, "start")
    .insert(10,'M');

System.out.println(sb.toString());
//返回数组中实际存储的字符个数
System.out.println(sb.length());
//返回数组的容量
System.out.println(sb.capacity());
//字符串反转
sb.reverse();
System.out.println(sb);

//使用reverse()判断对称数
String a = "67876";
StringBuffer b = new StringBuffer(a);
System.out.println(Objects.equals(a, b.reverse().toString()));

b = new StringBuffer("hello123world");
//删除指定索引区间的子串(前包后不包)
b.delete(5,8);
System.out.println(b);

1.2. StringBuffer与String字符串拼接效率对比

public class Test {

    public static void testString(int count, String sub) {
        String s = new String("");
        for (int i = 0; i < count; i++) {
            s += sub;
        }
    }

    public static void testStringBuffer(int count, String sub) {
        StringBuffer sb = new StringBuffer("");
        for (int i = 0; i < count; i++) {
            sb.append(sub);
        }
    }

    public static void main(String[] args) {
        //获取开始执行时间(毫秒ms   1000ms=1s)
        long start = System.currentTimeMillis();
//        testString(100000, "hello");  //35000+ 毫秒
        testStringBuffer(100000, "hello"); //10+ 毫秒
        long end = System.currentTimeMillis();
        System.out.println("耗时:" + (end - start));
    }

}

通过以上字符串效率拼接对比,可以发现StringBuffer在进行字符串拼接运算时,效率要远高于String

1.3. StringBuilder

StringBuilder是JDK1.5之后新增的一个可变长字符序列的实现(实现了CharSequence),并且具备了与StringBuffer一模一样的API;唯一区别在于StringBuilder是一个线程不安全的实现。

1.4. String,StringBuffer,StringBuilder总结

  • String是一个定长字符串,初始值即最终值,如果对其修改是在修改地址,如果只是使用String临时存储数据效率较高,但是在进行大量字符串拼接时候会频繁的创建新对象,从而会消耗大量时间,影响程序的性能。
  • StringBuffer是一个线程安全可变字符串,内部的方法都是用synchronized修饰,表示当前方法在多线程环境下同一时间只允许一条线程单独访问(其他线程阻塞),对数据的一致性安全性有一定保障,但是效率相对较低
  • StringBuilder是一个线程不安全的可变字符串,具备和StringBuffer相同的API,由于该类的方法没有加锁,在多线程环境下允许多个线程同时访问,因此效率较高,但是会存在并发安全问题(最终结果不确定),JDK1.5新增
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值