String,StringBuffer,StringBuilder三者的区别

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

 

posted @ 2018-02-09 16:49  水木清周  阅读(157)  评论(0编辑  收藏  举报