String类型使用“+”连接何时比直接使用StringBuilder效率高

String类型使用“+”连接何时比直接使用StringBuilder效率高

1、使用+操作符连接“字符串常量”和连接“变量”产生的结果是不一样的,代码如下:

public class TestString {
    public static void main(String args[]) {
    	String s1 = "programming";
    	String s2 = "java";
    	String s5 = "programmingjava";
    	String s3 = "programming"+"java";
    	String s4 = s1+s2;
    	System.out.println(s3==s5);//true
    	System.out.println(s4==s5);//false
    }
}

2、字符串常量进行连接的话,如果常量池中有该字符串,会直接指向该字符串;但是如果是字符串变量,那么会创建StringBuilder对象(jdk1.4以上),然后调用toString()方法转换成String对象,所以不会指向常量池中已经存在的对象;

public class TestString {
	public static void main(String[] args){
		String a = "aaa"+"bbb";//字符串常量相加(常量间的相加并不会引起效率问题)
		String b = a+"ccc";
		String c = a+b;
		String d = "ddd"+a;
		String f = "aa"+"dd";
		//cmd执行javac TestString.java对源文件编译产生class文件,使用XJad对该class文件进行反编译
		//对应的反编译结果如下
		/*String s = "aaabbb";
		String s1 = (new StringBuilder()).append(s).append("ccc").toString();
		String s2 = (new StringBuilder()).append(s).append(s1).toString();
		String s3 = (new StringBuilder()).append("ddd").append(s).toString();
		String s4 = "aadd";*/
	}
}

3、总结

如果是字符串常量连接,可以直接用“+”,这样不会有新对象的产生;但是如果有变量,如果是有循环的话,建议直接用StringBuilder,在循环外层创建对象,在循环里直接调用append方法即可;如果在循环中直接使用“+”连接字符串变量的话,那么每次循环都会产生新的StringBuilder对象,虽然Java有垃圾回收期,但是这个回收期何时工作是不可预见的,如果不断产生这样的垃圾,会占用资源,所以不要这么使用!另外也不推荐StringBuilder和“+”号混用;

你可能感兴趣的:(javase)