问题描述
JAVA中用于处理字符串常用的有三个类:
java.lang.String、java.lang.StringBuffer、java.lang.StringBuilder.
这三个类有共同点,都是final类,不允许被继承。同时也有一些区别,下面简单介绍一下它们的区别。
解决方案
这三个类之间的区别主要是运行速度和线程安全这两方面的区别。
在运行速度这方面,快慢比较的情况是:StringBuilder > StringBuffer > String。
String最慢的原因:String为字符串常量,字符串长度不可变。Java 中 String 是不可变的,String对象一旦创建之后该对象是不可更改的。所以,Java中对String对象进行的操作实际上是创建新的对象并把旧的对象进行回收,所以执行速度很慢。
StringBuilder和StringBuffer的对象是变量,是可变的,可以直接对StringBuilder和StringBuffer的对象进行更改,而不用创建新对象再回收,所以速度要比String快很多。
StringBuffer与StringBuilder都是继承自同一个抽象类,基本上方法都一样,实现也几乎都是一样的。而StringBuffer比StringBuilder效率低一些的原因就是StringBuffer的几乎所有方法都加了synchronized。我们可以看一下源码。
java.lang.StringBuilder
public StringBuilder append(String str) { super.append(str); return this; } |
---|
java.lang.StringBuffer
public synchronized StringBuffer append(String str) { toStringCache = null; super.append(str); return this; } |
---|
StringBuffer类的append方法,是被synchronized所修饰的。所以每次操作都要校验线程是否持有锁。相当于开门的时候,StringBuffer是用钥匙去开锁再推门,而StringBuilder是直接推门。所以从效率上来看自然是StringBuilder效率更高。
在线程安全这方面,StringBuilder是线程不安全的,而StringBuffer是线程安全的。多线程环境下,因为StringBuffer几乎所有方法都带有synchronized关键字,可以保证线程是安全的,但StringBuilder的方法则没有,所以不能保证线程安全,因此在多线程环境下有可能出现错乱。
结语
在只有少量的字符串操作时,推荐使用String。
在大量的字符串操作时,如果是单线程操作,请选择StringBuilder;但涉及到多线程操作同一个字符串时,请使用StringBuffer。
END
实习编辑 | 王文星
责 编 | 雀 跃