性能优化:StringBuilder>StringBuffer>String

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

 

遗留问题:

 

你可能感兴趣的:(Java基础,性能优化)