2008-07-09
String VS StringBuffer
下面从两段代码来看一下String和StringBuffer的区别
代码段一:
/*
String类是维持着一个 String池的,这个池初始化为空的,
当我们String x = "hello"的时候,hello就会被放入这个池中,当我们再次String y = "hello"的时候,他首先去检查池中是否存在一个和hello内容一样的对象,如果存在的话就会把这个引用返回给y,如果不存在的话,就会创建一个并放入到池中。这样就实现了复用。
在String有一个方法intern()他可以把String的对象放入到池冲并返回池中的对象。如果我们对s1 (String s1 = new String("hello")调用intern,s1 = s1.intern()这时候,我们再把s1和s3进行“==”的判断,你会发现结果返回true!
*/
public class TestString{
public static void main(String args[]){
String s1="hello";
String s2="hello";
if(s1==s2){
System.out.println("s1==s2");
}
else{
System.out.println("s1==s2 is false");
}
if(s1.equals(s2)){
System.out.println("s1.equals(s2)");
}
else{
System.out.println("s1.equals(s2) is false");
}
System.out.println();
String s3=new String("hello");
String s4=new String("hello");
if(s3==s4){
System.out.println("s3==s4");
}
else{
System.out.println("s3==s4 is false");
}
if(s3.equals(s4)){
System.out.println("s3.equals(s4)");
}
else{
System.out.println("s3.equals(s4) is false");
}
System.out.println();
if(s1==s3){
System.out.println("s1==s3");
}
else{
System.out.println("s1==s3 is false");
}
if(s1.equals(s3)){
System.out.println("s1.equals(s3)");
}
else{
System.out.println("s1.equals(s3) is false");
}
System.out.println();
s3=s3.intern();
System.out.println("after intern:");
if(s1==s3){
System.out.println("s1==s3");
}
else{
System.out.println("s1==s3 is false");
}
if(s1.equals(s3)){
System.out.println("s1.equals(s3)");
}
else{
System.out.println("s1.equals(s3) is false");
}
}
}
代码段二 :
public class TestStringBuffer{
//方法五:
public String getString1(String s1, String s2) {
return s1 + s2;
}
//方法六:
public String getString2(String s1, String s2) {
return new StringBuffer().append(s1).append(s2).toString();
}
/*
方法五:的效率与方法六一样,这是因为JVM会做如下处理
编译前 return s1 + s2;
编译后 return new StringBuffer().append(s1).append(s2);
*/
public static void main(String args[]){
//方法一:
String a="a"+"b"+"cc"+"dd";
//方法二:
StringBuffer sb=new StringBuffer();
sb.append("a");
sb.append("b");
sb.append("cc");
sb.append("dd");
a=sb.toString();
/*
方法一的效率>方法二的效率
要理解程序过程的两个时期,一个是编译时,一个是运行时,在编译时,编译器会对你的程序做出优化,所以第一个的String a会被优化成yacht1yacht2yacht3yacht4,而第二个的StringBuffer只会在运行时才处理。所以效率是不一样的。
方法一:
编译前 String a="a"+"b"+"cc"+"dd";
编译后 String a="abccdd";
*/
//方法三:
for(int i = 0; i< 100000;i++)
a += String.valueOf(i);
//方法四:
sb = new StringBuffer();
for(int i = 0; i< 100000;i++)
sb.append(i) ;
a = sb.toString();
/*
方法三的效率<方法四的效率
问题还在于运行时和编译时的优化问题上
*/
//方法七:
String s = "s1";
s += "s2";
s += "s3";
//方法八:
sb = new StringBuffer().append("s1").append("s2").append("s3");
/*
方法八的效率好于方法七,因为String是不可变对象,每次"+="操作都会造成构造新的String对象
*/
//方法九:
sb = new StringBuffer();
for (int i = 0; i < 50000; i ++) {
sb.append("hello");
}
//方法十:
sb = new StringBuffer(250000);
for (int i = 0; i < 50000; i ++) {
sb.append("hello");
}
/*
方法十的效率好于方法九,因为StringBuffer内部实现是char数组,默认初始化长度为16,每当字符串长度大于char数组长度的时候,JVM会构造更大的新数组,并将原先的数组内容复制到新数组,方法十避免了复制数组的开销
*/
}
}







评论排行榜