String、StringBuffer、StringBuilder

String、StringBuffer、StringBuilder 比较


先对三者的速度做一下比较:
1.String
image_1clliaguk1vq99a6rifk511ic63m.png-25.7kB
结果:
image_1cllibmfd136g129rg0m1ud21ptb43.png-11.1kB

2.StringBuffer:
image_1cllih7i3f4515741a8b50u1r64g.png-29.2kB
结果:
image_1clliiq071m104mt2mqimt16vh60.png-28.4kB

3.StringBuilder:
image_1clliptikgl0181j85cffrj6n6d.png-28.5kB
结果:
image_1clliqdputbcejj1bto1o931hee6q.png-9.5kB

三者的速度:
StringBuilder > StringBuffer > String


不以速度论成败

存在即是有道理的,我们下面分别来分析下各个的优势:
String类
是我们平常最常用的,却是最慢的,为什么?
关于下面这个简单的操纵:

    String a="abc";
        a+="de";

我们知道最后 a=”abcde”。我们眼睛看到的只是在后面添加了一个”de”进去,但是真实的操作却要比这复杂的多。
须知String创建的是一个常量,也就是创建了这个对象,你就不能对它进行修改了,那么是怎么实现添加“de”的呢?
机器内部隐藏地又新建了一个对象,然后在原来的基础上添加了”de”进去,同样这样是一个常量,创建好就不能修改了,而原来的”abc” 对象,失去作用后,之后就会被垃圾回收器回收。
所以,对于我们之前测试的那个for循环,我们消耗的时间之所以那么长,就是因为不断地在创建删除对象。

但是不可否认地是String操作起来的确很方便,他可以直接通过"+ ="来进行增添赋值。

StringBuffer和StringBuilder
通过之前的测试我们看到二者的速度差别不大,但是StringBuffer还是稍逊风骚,问题出在哪里?
阅读官方文档:

As of release JDK 5, this class has been supplemented with an
equivalent class designed for use by a single thread, StringBuilder.
The StringBuilder class should generally be used in preference to this
one, as it supports all of the same operations but it is faster, as it
performs no synchronization.

官方说明是对于不需要线程安全的程序,建议使用StringBuilder:
查看源码,果然如是:
StringBuffer里大多都是sychronized的:
image_1clljvdbo46j1sib1qa7bsogrt77.png-53.5kB
StringBuilder里没有sychronized:
image_1cllk6olgan741i1ba91dhv1vpb97.png-19kB
所以二者的用途也显而易见了,安全性是区分二者的最大因素。


用途总结:

  1. String用于字符串操作少的,要求简便的;
  2. StringBuffer适用于线程安全,比如多线程场景访问修改字符串的;
  3. StringBuilder使用单线程而字符串操作多,量大的。
posted @ 2018-08-24 17:39  顾杰伟  阅读(104)  评论(0编辑  收藏  举报