String 字符串常量
StringBuffer 字符串变量(线程安全)
StringBuilder 字符串变量(非线程安全)
这3个类之间的主要区别:运行速度 和 线程安全。
1.运行速度(一般情况): String < StringBuffer < StringBuilder 。
① String最慢原因:它为字符串常量,即String对象一旦创建后是不可更改的,而后两者是变量(可更改)。
每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,即不断创建新的对象并且将旧的对象回收的一个过程(JVM的垃圾回收机制(GC)给回收掉),所以执行速度很慢。
②特别情况:在某些特别情况下, String 对象的字符串拼接其实是被 JVM 解释成了 StringBuffer 对象的拼接,
像以下的字符串对象生成中(String 效率比 StringBuffer 快的):
String S1 = “a” + “b” + “c”;StringBuffer S2 = new StringBuilder(“a”).append(“b”).append(“c”);
其实这是 JVM 的一个把戏,在 JVM 眼里,这个String S1 = “a” + “b” + “c”; 其实就是:
String S1 = “abc”; 所以当然不需要太多的时间了。
但大家这里要注意的是,如果你的字符串是来自另外的 String 对象的话,速度就没那么快了,譬如:
String S2 = “a”;String S3 = “b”;
String S4 = “c”;
String S1 = S2 +S3 + S4;
这时候 JVM 会规规矩矩的按照原来的方式去做(创建新对象,回收旧对象)。
补充:
2.线程安全:
在字符串缓冲区被多个线程使用时,
StringBuffer对象安全,因为很多方法中可以带synchronized关键字可以保证安全;
StringBuilder的方法没有改关键字。
但是,在单线程的情况下:建议使用速度比较快的StringBuilder。
多线程在字符缓冲区操作StringBuffer,
单线程在字符缓冲区操作StringBuilder。
3、若感觉对你有所帮助点个赞