String、StringBuffer与StringBuilder

     似乎在平时编码中,String、StringBuffer与StringBuilder三者中只用到了String,另外两个很少用到。此篇来总结一下他们三者的区别、适用环境。

*String、StringBuffer与StringBuilder三者的区别?

    首先应该明确:String是字符串常量,StringBuilder和StringBuffer是字符串变量。其次就是StringBuilder线程不安全StringBuffer线程安全

上面的解释太过于表面,感觉有点像是在背概念,下面根据几个问题来分析!

   **String能够进行频繁的拼接吗?

    答案肯定是不能,因为字符串频繁的拼接会产生很多无用的字符串垃圾。例如,String str = 'a' + 'b' ;由于字符串的拼接会在字符串常量池中产生‘a’和‘b’两个字符串垃圾,而有用的不过是字符串“ab”罢了,这一行代码在字符串中开辟了三个空间,所以如果字符串频繁的拼接是很影响性能的,如果我们操作的数据比较少的话,虽会略微影响性能,但是由于数据量非常小,对性能的影响可以忽略不计,若要操作的数据量较大,这时就需要用到StringBuffer和StringBuilder了。

 

    **String的不可变带来的影响?

    由于String的不可变,其实每次操作的都不是其自身了,都是重新创建了一个新的字符串,原有的字符串就被丢弃了,比如:String s1 = 'a' +  'b';   s1 = "abc";   这个时候内存中含有"a"、"b"、"ab"和"abc"四个对象,现在的s1指向的是“abc”其他三个是无用对象。

     而对于StringBuilder和StringBuffer而言,他们的操作则是其本身,所以他们都是变量,不会再次创建一个新的对象。

 

 

*StringBuilder和StringBuffer?

    StringBuilder是线程非安全,StringBuffer是线程安全的,两者除了这点区别之外,其他的是一样的,两者的方法也一样。

//比较两者的效率
String str  = "a" + "b";    //对于jvm相当于String str  = "ab";

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

    上述两种实际上使用String比较快,如果是引用的字符串(如下代码),那就是StringBuffer的方式快了。

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

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

 

*String、StringBuffer和StringBuilder的适用环境?

①当操作的数据量较小可采用String。

②数据量比较大且需要修改字符串的话最好使用StringBuilder或者StringBuffer。

③在单线程中使用StringBuilder。

④在多线程中使用StringBuffer。

⑤总的来说StringBuffer线程安全但是效率低,而StringBuilder非线程安全但是效率高。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值