Q:String,StringBuffer,StringBuilder的区别
A:String是字符串常量,
StringBuffer是字符串变量,它是线程安全的,可用于多线程
StringBuilder也是字符串变量,但它是非线程安全的,常用于单线程
String与StringBuffer的区别:
String是字符串常量,For example:
String s = "abcd";
当操作字符串s时,如
s += "efg";
内存中,会先copy出"abcd",将"efg"加上去,再将s指向新生成的对象。如果进行多次这样的操作,
内存中就会有很多无用的String常量,GC(垃圾回收机制)就会工作,这会影响程序的性能。
StringBuffer则不一样,StringBuffer是直接在对象本身上操作,不会生成新的对象,不会造成内存的浪费。
所以通常情况下,我们采用StringBuffer,特别是在字符串经常改变的情况下。
但是在有些特殊情况下,String并不比StringBuffer慢。For example:
String s1 = "This is " + "a" + " string.";
StringBuffer s2 = new StringBuffer("This is ").append("a ").append("string.");
这时候,s1要比s2快的多。因为对于JVM来说,s1 = "This is a string.",而s2则是
s2 = "This is ";
s3 = "a ";
s4 = "string.";
s2 = s2 + s3 + s4;
所以s1要比s2快得多。
StringBuffer的常用操作时append()和insert(),append()是直接在内容后面加上要添加
的内容,而insert()则是插入到指定的位置,For example:
StringBuffer s = "abcd";
s = s.append("efg"); // 结果为s = "abcdefg"
s = s.insert(2, "efg"); // 结果为s = "abefgcd"
对于StringBuilder,其是在5.0加上的,与StringBuffer有兼容的API,但不保证线程同步。
如果可能,建议优先采用StringBuilder,因为大多数情况下,StringBuilder比StringBuffer要快。