下面从两段代码来看一下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会构造更大的新数组,并将原先的数组内容复制到新数组,方法十避免了复制数组的开销  
 */

	}
}
 
评论
发表评论

您还没有登录,请登录后发表评论