Java学习——常用类的学习之String,StringBuilder,StringBuffer三者的区别
最近,在学习字符串常用类时,学习到了String,StringBuilder,StringBuffer三个常用类,在这里整理一下这三者的区别,这三者的区别主要还是在于运行速度和线程安全。
1.运行速度方面:StringBuilder > StringBuffer > String
为什么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的速度是最慢的。
为了更深刻的理解,我们看一下上面这几行代码的内存图:
2.在线程方面:
StringBuffer是线程安全的,StringBuilder是线程不安全的。
所以StringBuffer速度要慢与StringBuilder。
看过这两个类的源码都知道StringBuffer中很多方法可以带有synchronized关键字,所以可以保证线程是安全的,但StringBuilder的方法则没有该关键字,所以不能保证线程安全。
那么我们在什么情况下使用这三种字符串类呢?
1.String:适用于少量字符串操作的情况
2.StringBuffer:适用于多线程环境下在字符缓冲区进行大量字符串操作的情况
3.StringBuilder:适用于单线程环境下在字符缓冲区进行大量字符串操作的情况