[Java基础]のString,StringBuffer,StringBuilder

首先:

1. String 是一个字符串常量  

2. StringBuffer 是一个字符串变量    线程安全但效率低

3. StringBuilder是一个字符串变量   线程不安全但效率高

常量就意味着不可变,变量就是可以修改.

String s1="abc";

            s1="abcdef";

由于String的不可变,其实每次操作改变的都不是其自身了,都是重新创建了一个新的字符串,原有的字符串就被丢弃了.

此时内存中包含:"abc","abcdef" 现在s1指向了"abcdef",其他的成了无用对象了.

 

设想如果频繁地进行字符串的拼接,会发生什么?

String s1="a"+"b";

那么会在字符串常量池(String Pool)中产生大量无用的字符创垃圾.如:"a","b".但我们只需要"ab".这会影响系统性能.如果数据量更大的话,那可能会导致内存溢出.

为了解决这种情况:出现了:

StringBuffer,StringBuilder.

StringBuffer

对于字符串的拼接:操作:

        StringBuffer buffer=new StringBuffer();
        buffer.append("a").append("b");

这样就产生了和String字符串拼接的相同结果."ab",还不会产生字符串垃圾.

StringBuilder

除了是线程不安全的,其他的都跟StringBuffer都一样

此外,对比三者之间の执行效率

 

        String s1="a"+"b";

        StringBuffer bf=new StringBuffer();
        bf.append("a").append("b");

哪两个效率快呢?

第一个:其实就等价于String s1="ab"; //只不过会产生字符串垃圾.

但是如果是引用的字符串,比如这样: 

        String s1 = "a";
        String s2 = "b";
        String s3 = s1 + s2;

那肯定是StringBuffer的方式比较快了。

 

因为其实对于字符串的拼接,其实String的“+”操作就是利用了StringBuffer的append方法,如果不是引用,相当于直接进行了转换,但是如果使用了引用,就要规规矩矩的先创建StringBuffer对象再进行拼接,这比着直接使用StringBuffer肯定就慢了啊。

 

总结:

所以根据这三者的区别,我们可以大致总结一下他们的用法。

当操作数据量较小可采用String
数据量比较大且需要修改字符串的话最好使用StringBuffer或者StringBuilder
在单线程中使用StringBuilder
在多线程中使用StringBuffer
总的来说StringBuffer线程安全但是效率低,而StringBilder非线程安全但是效率高。
 

你可能感兴趣的:(Java基础)