String、StringBuffer、StringBuilder之间的区别.三者在执行速度方面的比较:StringBuilder > StringBuffer > String
1、String
public final class String extends Object;
该类属于字符串常量类;它们的值在创建之后不能修改
String s1=”abc”;
String s2=”abc”
上面两行代码共创建了几个对象?
s1与s2按道理来说应该是两个引用对象,故因此应该创建了两个对象才是,这样想无可厚非。但其实只创建了一个对象,”abc”本身在字符串池中就是一个对象,然后赋值给引用对象s1。因为JVM先在字符串常量池中查找,看是否已经存在值为”abc”的对象,如果存在,则不再创建新的对象,返回已有的对象的引用。
/*
String s1=new String("abc");//创建了两个对象
String s3=”ab”;
s3=s3+”c”;//创建了两个对象,在内存中申请了两块内存区域
String s4=”a”+”b” +”c” ;//创建了一个对象,在内存中申请一块内存区域
System.out.println(s3==”abc”);
System.out.println(s4==”abc”);
第一个打印为false,第二个打印为true。详情请见:http://wenda.so.com/q/1364519961064179
由此可见:如果大量的使用String类的话,非常消耗内存,不利于优 化。
2.StringBuffer
该类属于多线程安全同步的可变字符串缓冲区。
该类常用到的方法有append(Object obj),insert(int offset,Object obj) ,这里就不做解释了。
优点是:StringBuffer buffer=new StringBuffer();
buffer.append(String str).append(…);
此方式追加字段,只会申请一块内存,较大的减少了内存的消耗。
3.StringBuilder
该类与StringBuffer兼容,属于单线程不同步的可变字符缓冲区。
使用情景:
当我们在字符串缓冲去被多个线程使用是,JVM不能保证StringBuilder的操作是安全的,虽然他的速度最快,但是可以保证StringBuffer是可以正确操作的。当然大多数情况下就是我们是在单线程下进行的操作,所以大多数情况下是建议用StringBuilder而不用StringBuffer的,就是速度的原因。
对于三者使用的总结:
1.如果要操作少量的数据用 = String
2.单线程操作字符串缓冲区 下操作大量数据 = StringBuilder
3.多线程操作字符串缓冲区 下操作大量数据 = StringBuffer