String s = "a" + "b" + "c"; 这里,我们先不考虑"a","b","c"是放置在池中这个问题。 这个"+"操作符,java到底是怎么对待的? 一种说法是"a"是一个字符串对象,+"b"之后,又生成一个字符串对象,大概是"ab",+"c"之后,再生成一个字符串对象,大概是"abc", 然后,把"abc"字符串对象的引用返回给s。这样,在这个过程中,共有6个字符串对象产生,这样效率低,所以应该用StringBuffer实现, 如: StringBuffer sb = new StringBuffer(100); sb = sb.append("a").append("b").append("c"); 再有一个说法,是java对“+”操作符进行重载,最终以StringBuffer实现以上字符串相加动作。 到底哪个说法对?其实以上的问题,也就是问,java对“+”到底重载成什么样子?
用bytecode来说明问题: 1.使用String + 的方式: public class Test2 { public static void main(String[] args) { String a = "a"; String b = "b"; String c = "c"; String s = a + b + c; } }
对应的bytecode为:
public class Test2 extends java.lang.Object{ public Test2(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."<init>":()V 4: return
2.使用StringBuffer.append()的方式: public class Test3 { public static void main(String[] args) { String a = "a"; String b = "b"; String c = "c"; StringBuffer sb = new StringBuffer(); sb.append(a).append(b).append(c); String s = sb.toString(); } }
对应的bytecode为:
public class Test3 extends java.lang.Object{ public Test3(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."<init>":()V 4: return