php网站支付宝接口,宁波在线网,个人可以做商城网站,凡科做的网站百度能收录吗在字符串拼接时应该都见过下面这种提示#xff1a; 大家普遍认知中#xff0c;字符串拼接要用StringBuilder#xff0c;那为什么idea会建议你是用呢#xff0c;那到底StringBuilder和有什么具体区别呢#xff0c;我们一起来探究一下。
普通拼接
普通的几个字符串拼接成一…在字符串拼接时应该都见过下面这种提示 大家普遍认知中字符串拼接要用StringBuilder那为什么idea会建议你是用呢那到底StringBuilder和有什么具体区别呢我们一起来探究一下。
普通拼接
普通的几个字符串拼接成一个字符串直接使用因为教材等原因当前依旧有许多人拼接字符串时认为使用耗性能首选StringBuilder。
实际上从JDK5开始Java编译器就做了优化使用拼接字符串编译器编译后实际就自动优化为使用StringBuilder。
新建测试类分别创建使用拼接字符串和使用StringBuilder拼接字符串的方法并新增Junit测试用例分别调用拼接字符串100000次这里不是循环拼接而是执行多次拼接因为一次拼接耗时太少看不出差异打印耗时。
/*** 使用拼接字符串*/
public String concatenationStringByPlus(String prefix, int i) {return prefix - i;
}/*** 使用StringBuilder拼接字符串*/
public String concatenationStringByStringBuilder(String prefix, int i) {return new StringBuilder().append(prefix).append(-).append(i).toString();
}
/*** 测试使用拼接字符串耗时*/
Test
public void testStringConcatenation01ByPlus() {long startTime System.currentTimeMillis();int count 100000;for (int i 0; i count; i) {String str concatenationStringByPlus(testStringConcatenation01ByStringBuilder:, i);}long endTime System.currentTimeMillis();System.out.println(testStringConcatenation01ByPlus拼接字符串 count 次花费 (endTime - startTime) 秒);
}/*** 测试使用StringBuilder拼接字符串耗时*/
Test
public void testStringConcatenation02ByStringBuilder() {long startTime System.currentTimeMillis();int count 100000;for (int i 0; i count; i) {String str concatenationStringByStringBuilder(testStringConcatenation02ByStringBuilder:, i);}long endTime System.currentTimeMillis();System.out.println(testStringConcatenation02ByStringBuilder拼接字符串 count 次花费 (endTime - startTime) 秒);
}执行Junit用例看耗时统计输出 虽然有差异但是差异极小考虑到执行了100000次每次耗时的差异就更小了而且程序执行有各种因素影响执行效率可以认为耗时差不多。也可以多次执行对比耗时差异也可以发现基本一致。
到class文件所在目录执行 javap -c StringTest.class对class文件进行反编译查看编译后的代码差异。这里不要进行反编译因为反编译有优化会都反编译成拼接的看不出来编译后的真正情况。 从图上可以看出两种拼接方法反编译后完全一样没有差异执行效率自然也是一样的。
既然执行效率一样从代码简洁利于阅读考虑推荐使用拼接字符串。
循环拼接
循环拼接一个长字符串建议使用StringBuilder虽然拼接字符串编译后也会变成StringBuilder但是每次循环处理都会new一个StringBuilder对象耗时会大大增加。而直接使用StringBuildernew一次就可以了效率相对高。
新增2个Junit测试用例循环拼接10000次拼接一个字符串次数少于上面的用例因为拼接的是一个字符串如果拼接次数太多可能引发内存溢出
/*** 循环使用拼接字符串*/
Test
public void testLoopStringConcatenation03ByPlus() {long startTime System.currentTimeMillis();int count 10000;String str testLoopStringConcatenation03ByPlus:;for (int i 0; i count; i) {str str - i;}System.out.println(str);long endTime System.currentTimeMillis();System.out.println(testLoopStringConcatenation03ByPlus拼接字符串 count 次花费 (endTime - startTime) 秒);
}/*** 测试循环使用StringBuilder拼接字符串耗时*/
Test
public void testLoopStringConcatenation04ByStringBuilder() {long startTime System.currentTimeMillis();int count 100000;StringBuilder stringBuilder new StringBuilder(testLoopStringConcatenation04ByStringBuilder:);for (int i 0; i count; i) {stringBuilder.append(-);stringBuilder.append(i);}String str stringBuilder.toString();System.out.println(str);long endTime System.currentTimeMillis();System.out.println(testLoopStringConcatenation04ByStringBuilder拼接字符串 count 次花费 (endTime - startTime) 秒);
}执行Junit用例看耗时统计输出 可以看出差异明显不在一个量级了。
总结 单纯的字符串拼接使用更快更简洁。 循环拼接时使用拼接字符串效率较低推荐使用StringBuilder。