目录
String和StringBuffer/StringBuilder的区别:
为什么String在字符串拼接时影响性能:
String类:
String类不可变:
StringBuffer和StringBuilder:
String和StringBuffer/StringBuilder的区别:
Java平台提供了两种字符串类型,String和StringBuffer/StringBuilder,这两种类型都可以存储字符串。其中String是可读字符串,不能直接修改。StringBuffer/StringBuilder可以直接修改。在字符串频繁拼接时,使用String对象会消费String池的空间,需要运行垃圾回收机制影响性能。所以在字符串频繁拼接时建议使用StringBuffer和StringBuilder。
为什么String在字符串拼接时影响性能:
String类:
String类在java.lang包中,代表字符串,Java程序中所有的字符串文字都被视为此类的实例。
public final class String extends Object implements Serializable, Comparable, CharSequence
String类不可变:
String类中存在成员变量value,value指向一个字符数组,这个数组用来存储字符串的字符。变量value在声明时使用final修饰,所以在赋值后不能在指向其他的地址,并且在String类中并没有提供修改value指向的数组的方法,所以String类型的值是不可变的。
在StringBuffer类中提供了修改这个数组元素的方法,所以StringBuffer是可变的。
在用String拼接字符串时,由于String是不可变的,在拼接时会自动创建StringBuffer对象并调用append和toString方法拼接字符串,每拼接一次就会创建一个对象,虽然Java中有垃圾回收机制的存在,但垃圾回收机制的运行与否和何时运行都是不可控的,所以在字符串频繁拼接时会影响性能、占用空间。
StringBuffer是可变的,相比String在字符串拼接时节省了创建对象和回收对象的时间,所以在字符串频发拼接时StringBuffer的性能优与String。
StringBuffer和StringBuilder:
StringBuilder是在java5中引用的,它与StringBuffer的方法完全相同。StringBuffer的大部分方法都使用的synchronized修饰,而StringBuilder的所有方面都没有被synchronized修饰。所以StringBuilder适用于单线程,在效率上要比StringBuffer高,但在安全性上低于StringBuffer。



