String、StringBuffer、StringBuilder的区别

92 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第21天,点击查看活动详情

String、StringBuffer、StringBuilder的区别

String的特点

String 可以说是我们平时开发中接触最多,也使用最多的类之一,String类提供了构造和管理字符串的各种基本逻辑。它被声明为 final class,这表明String是一个不可变类,其他人不可以继承String对String的属性进行修改,并且String中所有的属性也都是 final 的。

由于String的不可变性,一般的拼接、截取字符串等操作,不会对原有的String对象进行修改,都会在内存中产生新的 String对象。由于字符串操作往往都比较普遍,所以相关操作的效率往往对性能有明显的影响。

StringBuffer的特点

StringBuffer 的诞生,是在JDK 1.5之后,为了解决String在拼接过程中,产生太多中间对象的问题而出现的,提供的一个类,在使用StringBuffer的过程中,我们可以用 append() 或者 add()方法,把字符串添加到已有字符串的末尾或者指定位置。

StringBuffer 本质是一个线程安全的可修改字符数组,在保证了线程安全的同时,也带来了锁同步额外的性能开销,除非有线程安全的使用场景,一般情况下还是使用StringBuilder更好,相对来说效率也更高。

StringBuilder

StringBuilder 在底层和实际使用上和 StringBuffer 没有太大区别,并且底层使用的数据存储结构也都是一样的,不同的是StringBuilder非线程安全,在StringBuilder内部的方法中去掉了线程安全的修饰,所以在没有线程竞争产生线程不安全的场景下,StringBuilder的效率和开销都是更优于StringBuffer的,实际开发中的使用率也很高。

总结

String 是 不可变类的典型实现,基于底层的数据存储保证了基础线程安全,无法底层的内部数据进行修改。

StringBuffer 的线程安全是通过把各种修改数据的方法都加上 synchronized 关键字实现的。

StringBuilder的底层基本上和StringBuffer一样,只是方法上没有用synchronized修饰,底层都是可修改的byte数组。