您的位置:首页 > 产品设计 > UI/UE

性能优化:StringBuilder>StringBuffer>String

2015-07-30 15:21 543 查看
String、StringBuffer、StringBuilder的区别

String 字符串常量

StringBuffer 字符串变量(线程安全)

StringBuilder 字符串变量(非线程安全)


1.String是不可变对象,所以对String类型进行改变的时候等于生成了一个新的String对象,然后将指针指向新的String对象,所以经常改变内容的字符串最好不要用String,因为每次改变都会对系统性能产生影响,当内存中无引用对象很多时,JVM的GC(内存回收算法)会开始工作,会降低java程序工作效率。

2.StringBuffer是可变对象,每次改变都会对StringBuffer对象本身进行操作,不生成新的对象,直接改变对象引用。所以一般情况推荐使用StringBuffer,特别在字符串对象经常改变的情况下。

3.特殊情况,有时String对象的字符串拼接被JVM解释成SringBuffer对象的拼接,这时,String效率远比StringBuffer快。

例子:String str = "Hello " + "World " + "!";

StringBuffer sb = new StringBuffer("Hello ").append("World ").append("!");

这种情况下,String比StringBuffer对象速度快,因为此时JVM将
String str = "Hello " + "World " + "!"; 理解为
String str = "Hello World !"; 但是,如果字符串是由String对象组成,则速度不会像这样快。

例子:String
s1 = "Hello ";


String s2 = "World ";


String s3 = "!";


String s4 = s1 + s2+ s3;

这时,JVM会按照原本的方式进行。

总结1:大部分情况,StringBuffer
> String

4.Java.lang.StringBuffer线程安全的可变字符序列。通过方法的调用可以改变其包含的字符序列的长度和内容,可以将字符串缓冲区安全地用于多个线程。StingBuffer的主要操作方法有:append和insert,可重载这些方法,以接受任意类型的数据。每个方法都能将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区。append方法始终将这些字符添加得到缓冲区的末端;insert方法则在指定点添加字符。

StringBuffer的方法都加上了synchronized关键字,因此在一定场景下,该类型的对象都是线程安全的,但在执行效率上,由于多了线程同步的操作,所以会有一定的损失。

5.StringBuilder线程不安全的可变字符序列。JDK1.5时才出现,该类的设计是StringBuffer类的简易替换,用在字符串缓冲区被单个线程使用的时候,由于少了线程同步的操作,执行效率有很大的提升,建议优先采用该类。

总结2:大部分情况下,StringBuilder
> StringBuffer



遗留问题:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: