作者:http://hi.baidu.com/576699909/item/568a54638177fd96c4d2496b
反编译的思路很赞,另外自动优化的优化代码是编译器做的么。。保留疑问
网上的JAVA面试题经常有两个String 字符串相加没有 StringBuffer.append();速度高 但是很少有说明原因的。 所以自己做了个小测试 源代码1 public class TestMain { public static void main(String[] args) { String test1="测试测试1"; String test2="测试测试2"; String test3=test1+test2; System.out.println(test3); } } 结果编译后的class 然后再反编译 发现 代码已经被默认优化成 import java.io.PrintStream; public class TestMain { public static void main(String args[]) { String test1 = "测试测试1"; String test2 = "测试测试2"; String test3 = (new StringBuilder(String.valueOf(test1))).append(test2).toString(); System.out.println(test3); } } 源代码2 public static void main(String[] args) { String test1="测试测试1"; String test2="测试测试2"; StringBuffer test3=new StringBuffer(); test3.append(test1); test3.append(test2); System.out.println(test3); } 先编译再反编译 的结果跟以前一样 结果: 很明显 连个字符串 相加 最后都优化成了 StringBuilder的.append(); 查了一下源代码 StringBuilder 类 和 StringBuffer 类都 继承于 AbstractStringBuilder public final class StringBuffer extends AbstractStringBuilder implements java.io.Serializable, CharSequence { public synchronized StringBuffer append(String str) { super.append(str); return this; } } public final class StringBuilder extends AbstractStringBuilder implements java.io.Serializable, CharSequence { public StringBuilder append(String str) { super.append(str); return this; } } 而且都是调用AbstractStringBuilder 的 public AbstractStringBuilder append(String str) { if (str == null) str = "null"; int len = str.length(); if (len == 0) return this; int newCount = count + len; if (newCount > value.length) expandCapacity(newCount); str.getChars(0, len, value, count); count = newCount; return this; } 方法 经过以上得到以下结论: 所以 如果用加号相加两个字符串 比用StringBuffer.append() 方法 多创建对象而且没有append线程安全。