学姐起的标题,抢先用一下。

在《Effective Java》第51条:“当心字符串连接的性能”一文中介绍的原则是:不要使用字符串连接操作符来合并多个字符串,除非性能无关紧要。相反,应该使用StringBuilder的append方法。

所以我一直以为应该尽量使用StringBuilder。直到今天review学姐的代码后才发现并非总是如此。

直接上测试代码(保存成Demo.java):

public class Demo{
    public static void main(String[] args) {
        String a = "a" + "b" + "c";
        StringBuilder sb = new StringBuilder();
        String b = sb.append("d").append("e").append("f").toString();

        System.out.println(a);
        System.out.println(b);
        return;
    }
}

编译后再查看字节码(编译方法:javac Demo.java,反编译的方法:javap -c Demo): enter image description here

可以看出,编译器直接合并了"a" + "b" + "c"变成“abc”,而StringBuilder还需要调用3次才行。

虽然没有实际验证旧版本的编译器,但我猜想,早期的编译器并没有这么智能,所以Effective Java里面的建议在当时是正确的。但随着编译器的进化,书上发现的那些陷阱和缺陷已经被修正,反而书上的有些内容变得过时和错误了。

结论:

  1. 编译器的目的就是让编程变得越来越容易,因为做编译器的那些人比一般的程序员更聪明。
  2. 技术书籍过时太快,或者说技术本身过时就很快。
  3. 人生苦短,还是赶快用Python吧。