似乎在平时编码中,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非线程安全但是效率高。