前置知识String是java中的一个不可变类。一旦创建了不可变类的实例,就不能修改其成员变量的值。这种设计可以缓存hashcode,使用起来更方便,也更安全。Java不支持运算符重载运算符重载:在计算机编程中,运算符重载(英文:operatoroverloading)是多态的一种。运算符重载就是重新定义一个已有的运算符,赋予它另一种功能,以适应不同的数据类型。句法糖:句法糖,又译为糖衣语法,是英国计算机科学家彼得·兰丁发明的一个术语,是指在计算机语言中加入的某种语法,对语言的功能没有任何影响。但是程序员使用起来更方便。语法糖使程序更简洁,更易读。常见的字符串拼接方法有使用符号'+'拼接、使用String类中的concat方法拼接、使用StringBuffer拼接、使用StringBuilder拼接、StringUtils.join使用符号'+'拼接使用+连接字符串。事实上,它只是Java提供的。StringBuilder.append的语法糖//使用符号'+'拼接字符串Stringhollis=wechat+","+introduce;//上述代码的反编译结果Stringhollis=(newStringBuilder()).append(微信).append(",").append(介绍).toString();从反编译代码来看,每次用+拼接字符串都会新建一个StringBuilder,然后把String转成StringBuilder,再追加。如果在for循环中使用+拼接字符串,会频繁创建新的对象,不仅会耗费时间,还会造成内存资源的浪费。因此,根据阿里巴巴Java开发手册的建议:在循环体中,使用StringBuilder的append方法扩展字符串的连接方法,而不是使用+。使用String类中的concat方法拼接用法Stringhollis="wechat".concat(",").concat("introduce");String类中concat方法源码publicStringconcat(Stringstr){if(str.isEmpty()){returnthis;}intlen=值。长度;intotherLen=海峡。长度();charbuf[]=数组。copyOf(值,len+otherLen);海峡getChars(buf,len);returnnewString(buf,true);}可以看到,concat方法首先创建了一个字符数组,其长度为已有字符串和待拼接字符串的长度之和,然后复制其中的值两个字符串到新的字符数组,并使用这个字符数组创建一个新的String对象并返回它。通过源码我们也可以看到,在concat方法之后,其实是new了一个String,这也呼应了我们前面说的字符串的不变性。使用StringBuffer和StringBuilder拼接StringBuffer和StringBuilder都继承了AbstractStringBuilder类。在AbstractStringBuilder类中,定义了一个字符数组char[]值。与String类不同的是,它没有final修饰符,所以可以修饰StringBuffer和StringBuilder,最大的区别在于StringBuffer是线程安全的。StringBuffer使用synchronized声明,重写了AbstractStringBuilder类中的一些方法,@Overridepublicsynchronizedintlength(){returncount;}StringUtils.joinApache(version3.8)StringUtils.join的源码}finalintnoOfItems=endIndex-startIndex;如果(noOfItems<=0){返回EMPTY;}finalStringBuilderbuf=newStringBuilder(noOfItems);for(inti=startIndex;i
