前言
相信大家对于string 已经stringbuild已经不陌生了,这两个都是可以创建一个字符串并对字符串进行操作,那么他俩之间有什么区别呢,今天我们就来简单的聊一聊。
操作字符串的三大类: 在java中提供三个类String StringBuillder StringBuffer来表示和操作字符串。字符串就是多个字符的集合。 String是内容不可变的字符串。String底层使用了一个不可变的字符数组(final char[])
String str =new String(“bbbb”);
而StringBuillder StringBuffer,是内容可以改变的字符串。StringBuillder StringBuffer底层使用的可变的字符数组(没有使用final来修饰)
最经典就是拼接字符串:
1、String进行拼接
String c = “a”+”b”;
2、StringBuilder或者StringBuffer
StringBuilder sb = new StringBuilder();
sb.apend(“a”).apend(“b”)
拼接字符串不能使用String进行拼接,要使用StringBuilder或者StringBuffer
3.StringBuilder是线程不安全的,效率较高.而StringBuffer是线程安全的,效率较低。
为什么StringBuffer和StringBuilder的执行效率高:
String在java中是不可变长的,一旦初始化就不能修改长度,简单的字符串拼接其实是创建新的String对象,再把拼接后的内容赋值给新的对象,在频繁修改的情况下会频繁创建对象,而StringBuilder则不会,从头到尾只有一个实例对象。
那StringBuilder是怎么实现的呢?
StringBuilder在进行append方法连接字符串的时候并不是用String存储,而是存放到一个名为value的char[]数组当中,字符串是固定长度的,而数组是可以扩容的,因此就不需要在不停创建对象了。
StringBuffer和StringBuilder的比较:
- StringBuffer:线程安全; StringBuilder:线程不安全。
因为StringBuffer的所有公开方法都是synchronized修饰的,而StringBuilder并没有synchronized修饰。
- 缓冲区问题
StringBuffer每次获取toString都会直接使用缓存区的 toStringCache值来构造一个字符串。StringBuilde 则每次都需要复制一次字符数组,再构造一个字符串。所以说StringBuffer利用缓存区进行了部分优化操作。
- 性能问题
StringBuffer是线程安全的,它的所有公开方法都是同步的,而StringBuilder 是没有对方法加锁同步的,因此StringBuilder的性能要大于StringBuffer。