(1)String:
String s="abc";
如果像上面这样声明String变量,则现在jvm的方法区的运行时常量池中寻找是否存在"abc"这个字符串。
如果有就使用已经存在的,如果没有,则在运行时常量池创建这个字符串。
String s="abcd";
String 字符串是不可更改的,接着执行上句代码,将创建"abcd";
String s1=new String("abc");
上述方式new创建的字符串,是在jvm内存的堆中创建的。另外String s3=s1+s2;这种也是在堆上创建的
(2)StringBuffer:
StringBuffer是线程安全的,因为它的方法都带有synchronized关键字。比如append方法:
@Override
public synchronized StringBuffer append(String str) {
toStringCache = null;
super.append(str);
return this;
}
StringBuffer是可以更改的,所以StringBuffer适合多线程下字符串的大量操作时使用。
(3)StringBuilder:
StringBiulder是可以更改的,但不是线程安全的,适合单线程下字符串的大量操作时使用。
执行速度:StringBuilder>StringBuffer>String