Java:String、StringBuffer和StringBuilder的区别
在公司实习期间,慢慢的体会到了作为一名开发人员,公司的Code convention是多么的重要。
下面一条便是公司列举出来的。
1. Rather than “String”, “StringBuffer” is recommended to be used to concatenate character strings.
Especially when a string is constructed by concatenating data in a loop, or when a string content is changed for numerous amount of times before it is returned/displayed, “StringBuffer” should be used. Sample code could be like:
StringBuffer stringBuffer = new StringBuffer();
for (int i=0; i<100; i++) {
stringBuffer.append("sample string");
}
return stringBuffer.toString();
大致意思是说,在连接字符串时,比起String,更推荐使用StringBuffer。尤其是当一个String在一个循环中用来连接数据的时候,或者在这个String返回之前它的内容需要频繁修改时,这时候就应该使用StringBuffer了。
查了下网上的资料。加上别人的参考,下面是自己的总结部分。希望能帮到大家。
1. String:它是不可变(immutable)的对象,对String对象进行改变的时候其实都等同于生成了一个新的String对象,然后将引用指向新的String对象,原String对象GC回收。
2. StringBuffer 字符串变量(线程安全),适用于多线程程序中,保证同步性,如果要频繁对字符串内容进行修改,出于效率考虑最好使用StringBuffer,如果想转成String类型,可以调用StringBuffer的toString()方法。
2.1 初始化:
StringBuffer s = new StringBuffer(“abc”);
2.2 转换 : 需要注意的是,StringBuffer和String属于不同的类型,也不能直接进行强制类型转换,下面的代码都是错误的:
StringBuffer s = “abc”; //赋值类型不匹配 StringBuffer s = (StringBuffer)”abc”; //不存在继承关系,无法进行强转
2.3 StringBuffer对象和String对象之间的互转的代码如下:
String s = “abc”; StringBuffer sb1 = new StringBuffer(“123”); StringBuffer sb2 = new StringBuffer(s); //String转换为StringBuffer String s1 = sb1.toString(); //StringBuffer转换为String .toString()
StringBuilder 字符串变量(非线程安全),适用于单线程程序中,不保证同步性。简要的说, String 类和 StringBuffer/StringBuilder 类的主要性能区别其实在于 String 是不可变的对象, 因此在每次对 String 类进行改变的 时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String 而如果是使用 StringBuffer/StringBuilder 类则结果就不一样了,每次结果都会对 StringBuffer/StringBuilder 对象本身进行操作,而不是生成新的对象,再改变对象引用。所以在一般情况下推荐使用 StringBuffer/StringBuilder ,特别是字符串对象经常改变的情况下。
用法:append,insert, remove,replace, delete
StringBuffer sb = new StringBuffer(“TestString”); sb. delete (1,4);
上面代码的作用是删除索引值1(包括)到索引值4(不包括)之间的所有字符,剩余的字符形成新的字符串。则对象sb的值是”TString”。
两者的常用操作:append(), toString(), insert(), reverse(), delete()等。
在大部分情况下 StringBuilder > StringBuffe 以为前者不需要考虑线程安全。