public final class String{}
String s1 = "abc";
String是不可变的
StringBuffer是可变的且是线程安全的
StringBuilder是可变的且是非线程安全的
在大部分情况下字符串的拼接速度为:
StringBuilder>StringBuffer>String
解释如下:
因为String是不可变的(其属性大都为final类型),因此每次对其操作改变其变量值,其实是生成一个新的字符串,然后将变量引用指向新字符串对象;因此速度慢。
StringBuffer则不同,对其操作即直接操作对象指向的内容,无需产生新对象,速度快,但它是线程安全的,在维护多线程的同步等也会消耗一点性能。
StringBuilder是jdk5之后新增的,其用法与StringBuffer完全一致,但它是线程不安全的,在单线程中最佳,因为其不需要维护线程的安全,因此是最快的。
举例1:
String a = "a"; //假设a指向地址0x0001
a = "b";//重新赋值后a指向地址0x0002,但0x0001地址中保存的"a"依旧存在,但已经不再是a所指向的。因此String的操作都是改变赋值地址而不是改变值操作
举例2:
String S1 = “This is” + “ my first ” + “java”;
StringBuffer Sb = new StringBuffer(“This is”)
.append(“ my first ”)
.append(“java”);
此时,String 效率是远比 StringBuffer 快,而StringBuffer居然速度上一点都不占优势。其实这时在 JVM 眼里,这个
String S1 = “This is” + “ my first ” + “java”;
其实就是:
String S1 = “This is my first java”; 因此当然不需要太多的时间了。
但大家这里要注意的是,如果这些拼接的字符串是来自另外的 String 对象的话,速度就没那么快了,譬如:
String S2 = “This is only a”;
String S3 = “ simple”;
String S4 = “ test”;
String S1 = S2 +S3 + S4;
StringBuffer的主要操作:
append(str)--将字符串添加到原有字符串的末端
例:StringBuffer str = new StringBuffer("hello");
str.append("java"); //str为“hello java”
insert(index,str)--在指定的点添加字符串
例: str.insert(2,"java"); //为“hejavallo”
总结:
对于经常改变内容的字符串最好不要用 String ,因为每次生成新的对象都会对系统性能产生影响,特别当内存中无外部引用的对象多了以后, JVM 的 GC 就会开始工作,会很大程度上影响系统的运行速度。