String,StringBuffer,StringBuilder三者的区别
1、 String
String为标准的字符串常量,String对象底层为char类型数组,且对象一经创建就不能更改,由final修饰,如图:
String做字符串拼接的时候效率很低,例如:
String str = "ab";
str = str + "cd";
速度慢的原因:
对于这段代码,JVM的处理方式是 第一行代码创建了名为str的String对象,并赋值为“ab”,第二行代码JVM再次创建了一个名为str的新对象,并把原来的str和"cd"加起来赋值给他,然后JVM会GC掉第一个str对象,所以String对象做字符串拼接,实际上是一个不断创建并回收对象的过程,非常影响速度性能。
2、 StringBuilder
StringBuilder 继承自 AbstractStringBuilder,相当于在String 类的基础上新增封装了很多针对字符串值操作的方法,并且,底层的char类型数组不再声明为final类型,如图:
底层数据结构未用final修饰
3、 StringBuffer
StringBuffer同样继承自 继承自 AbstractStringBuilder,结构与StringBuilder相似,不同的是在针对字符串操作并且需要线程安全的方法都以Synchronizated修饰
所以他是线程安全的,但他也因此比StringBuilder速度慢。如图:
synchronized修饰 线程安全
正常情况下字符串操作的速度是StringBuilder > StringBuffer > String
所以建议:
1、在字符串操作较少是,使用String
2、线程安全的情况下,使用StringBuilder,速度较快
3、非线程安全的情况下,使用StringBuffer