本文共 1094 字,大约阅读时间需要 3 分钟。
最近,在学习字符串常用类时,学习到了String,StringBuilder,StringBuffer三个常用类,在这里整理一下这三者的区别,这三者的区别主要还是在于运行速度和线程安全。
为什么String运行速度最慢?因为我们知道String一旦创建其值就不能更改,但是StringBuilder,StringBuffer创建后是可以更改其值的 。我们来看一下下面代码:
public class Test { public static void main(String[] args) { String str = "abc"; System.out.println(str);//输出:abc str = str + "ddd"; System.out.println(str);//输出:abcddd }}
那么有人看到上面的代码就好奇了,不是说String一但创建就不能改变了吗,为什么第二个打印的结果会是abcddd呢?我们看起来像是str的对象被更改了,其实并不是这样。首先先创建一个String对象str,并把“abc”赋给它,然后当运行到 str = str + “ddd”;时,java的JVM虚拟机又创建了一个新的对象str,并把“abc”和“ddd”拼接起来付给它,之前的str没有引用所以被垃圾回器回收掉了。拼串的过程其实是一个不断创建新的对象再赋值的过程。所以String的速度是最慢的。
为了更深刻的理解,我们看一下上面这几行代码的内存图:
StringBuffer是线程安全的,StringBuilder是线程不安全的。
所以StringBuffer速度要慢与StringBuilder。看过这两个类的源码都知道StringBuffer中很多方法可以带有synchronized关键字,所以可以保证线程是安全的,但StringBuilder的方法则没有该关键字,所以不能保证线程安全。
那么我们在什么情况下使用这三种字符串类呢?
1.String:适用于少量字符串操作的情况 2.StringBuffer:适用于多线程环境下在字符缓冲区进行大量字符串操作的情况 3.StringBuilder:适用于单线程环境下在字符缓冲区进行大量字符串操作的情况转载地址:http://pxiwi.baihongyu.com/