String,StringBuffer,StringBuilder的区别


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要快。
posted @ 2015-03-10 20:30  Coder816  阅读(166)  评论(0编辑  收藏  举报