String,StringBuffer与StringBuilder的区别(运行速度+线程安全)?

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 会规规矩矩的按照原来的方式去做(创建新对象,回收旧对象)。

补充:

StringBuffer 主要操作是 append()和 insert() 方法,可重载以接受任意类型的数据。
每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区中。
append 方法始终将这些字符添加到缓冲区的末端
insert 方法则在指定的点添加字符
     例子:如果Obj引用一个当前内容是“123”的字符串缓冲区对象,则此方法调用Obj.append("4") 会使字符串缓冲区包含“1234”,而Obj.insert(2, "4") 将更改字符串缓冲区,使之包含“1243”。

2.线程安全:

在字符串缓冲区被多个线程使用时,

StringBuffer对象安全,因为很多方法中可以带synchronized关键字可以保证安全;

StringBuilder的方法没有改关键字。

但是,在单线程的情况下:建议使用速度比较快的StringBuilder。

多线程在字符缓冲区操作StringBuffer,

单线程在字符缓冲区操作StringBuilder。

3、若感觉对你有所帮助点个赞





你可能感兴趣的:(java基础知识点)