Java中String对"+"的"重载"

864

在Java语言中,操作符重载是不被允许的。尽管操作符重载会提高项目的灵活性,但是会提高项目的复杂性,可读性也大大降低。操作符重载与Java的设计思想(严格的面向对象)相悖。 但是对String对象而言,它是可以直接+将两个String对象的字符串值相加。乍看起来这是对+的重载,但我们可以通过class文件看出,这只是JVM做的语法糖。 来看一个简单的例子:

public class A{ 
    public static void main(String[] args){
        String a = "1";
        String b = "2";
        System.out.println(a+b);
    }
}

我们运行一下,结果是12,没什么问题。 反编译一下这个java文件:

javap -c A.java

反编译结果

暂且不管左边那些汇编啥意思,单看右边的注释

  • 9:新建了一个StringBuilder对象
  • 17和21:两次append()
  • 24:springBuilder.toString()方法

所以说,String的+操作根本不是重载,他只是JVM做的有个简化操作,实际上还是调用了StringBuilder进行相加。

在阿里巴巴编码规约中有明确提到,推荐在循环时的字符拼接采用StringBuilder.append()方法而不是+。因为循环使用+会最终导致创建多个StringBuilder对象,造成资源浪费。