Java中关于字符串有三个相关的类:String,StringBuilder和StringBuffer,那么这三个类之间有什么区别呢?cnblogs博主酥风对此做了整理记录,摘抄过来仅供参考。
简单来说,这三个类之间的区别主要是在两个方面:运行速度和线程安全。
运行速度
首先来看运行速度,StringBuilder > StringBuffer > String 。
String最慢的原因在于:String为字符串常量,即String对象一旦创建之后是不可以更改的,但后两者的对象是变量,是可以更改的。以下面的一段代码为例,
String str = "abc";
System.out.println(str);
str = str + "de";
System.out.println(str);
如果运行这段代码会发现先输出abc
,然后又输出abcde
,好像是str
这个对象被更改了。但其实,这只是一种假象罢了。
JVM对于这几行代码是这样处理的:
- 首先创建一个String对象
str
,并把"abc"
赋值给str
- 然后在第3行中,JVM又创建了一个新的对象也名为
str
- 然后再把原来的
str
的值和"de"
加起来再赋值给新的str
- 原来的
str
最后被JVM的GC机制回收
因此,str
实际上并没有被改变,也就是前面提到的:String对象一旦创建之后就不可更改了。换言之,Java中对String对象的操作实际上是一个不断创建新的对象并且将旧的对象回收的一个过程,所以执行速度很慢。
而StringBuilder和StringBuffer的对象是变量,对变量进行操作就是直接对该对象进行更改,而不进行创建和回收的操作,所以速度要比String快很多。
另外,有时候我们会这样对字符串进行赋值,
String str = "abc" + "de";
StringBuilder stringBuilder = new StringBuilder().append("abc").append("de");
System.out.println(str);
System.out.println(stringBuilder.toString());
这样输出的结果也是abcde
和abcde
,但是String的速度却比StringBuilder的反应速度快很多,这是因为第1行中的操作和String str = "abcde";
是完全一样的,所以会很快。如果写成下面的形式,
String str1 = "abc";
String str2 = "de";
String str = str1 + str2;
那么JVM就会像之前所提到的,不断的创建、回收对象来进行这个操作,速度就会很慢。
线程安全
从线程的角度来看,StringBuilder是线程不安全的,而StringBuffer是线程安全的。
如果一个StringBuffer对象在字符串缓冲区被多个线程使用时,StringBuffer中很多方法可以带有synchronized
关键字,所以可以保证线程是安全的;而StringBuilder的方法则没有synchronized
关键字,所以不能保证线程安全。
多线程的操作时,需要使用StringBuffer
单线程的情况下,建议使用StringBuilder,速度较快
总结
- String:适用于操作少量字符串的情况
- StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况
- StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况
参考文章