转载

原文地址:https://mp.weixin.qq.com/s/79r0U7C7L1JIbwUnczeVLw

https://cdn.nlark.com/yuque/0/2020/png/576791/1603730600300-b2a3b924-3502-462e-82ab-257c544185f1.png

一、简介

字符串拼接在程序中是很常用的,关键是需要了解各种字符串拼接方式原理,优先选择最好的字符串拼接方式。Java程序中提供了几种不同的拼接方式。

二、“+”号字符串拼接

“+”号字符串拼接是最简单方便的方式,刚学编程的时候,几乎都是用此方式。

1)字符串拼接方式

String s1 = "ouyangjun";
String s2 = "p812438109";
System.out.println(s1 + s2); // ouyangjunp812438109

2)反编译之后的源码

System.out.println(new StringBuilder(String.valueOf(s1)).append(s2).toString());

结论:编译时,先new一个StringBuilder对象,再把参数append到对象中,最后再toString。

3)字符串拼接方式

String s1 = "ouyangjun";
String s2 = "p812438109";
String s3 = "";
for (int i = 0; i < 10000; i++) {
    s3 += s1 + s2;
    System.out.println(s3);
}

4)反编译之后的源码

String s1 = "ouyangjun";
String s2 = "p812438109";
String s3 = "";
for (int i = 0; i < 10000; i++) {
    s3 = new StringBuilder(String.valueOf(s3)).append(s1).append(s2).toString();
    System.out.println(s3);
}

结论:在用"+"号拼接时,不管是什么方式拼接,都是会不断new StringBuilder对象。如循环次数越多,该拼接方式性能会越低,最终可能导致内存溢出等问题。现在程序中都不建议用该方式拼接字符串了。

三、StringBuffer字符串拼接

1)StringBuffer字符串拼接和反编译之后的源码是一样,没有太大的区别,如下。

StringBuffer buffer = new StringBuffer();
buffer.append("ouyangjun");
buffer.append("p812438109");
System.out.println(buffer); // ouyangjunp812438109
StringBuffer buffer = new StringBuffer();
for (int i = 0; i < 10000; i++) {
    buffer.append("ouyangjun").append("p812438109");
    System.out.println(buffer);
}