java中拼接字符串的5种方法效率对比
作者:justlinzhihe 发布时间:2022-01-08 05:46:18
标签:java,字符串拼接,效率
前言
最近写一个东东,可能会考虑到字符串拼接,想了几种方法,但对性能未知,所以下面就来测试下面,话不多说了,来一起看看详细的介绍吧。
示例代码
public class Test {
List<String> list = new ArrayList<>();
@Before
public void init(){
IntStream.range(0, 100000).forEach((index) -> {
list.add("str" + index);
});
}
@org.junit.Test
public void test1() {
String ss = "";
long startTime = System.currentTimeMillis();
for (String s : list) {
ss += s;
}
System.out.println(System.currentTimeMillis() - startTime);
}
@org.junit.Test
public void test2() {
String ss = "";
long startTime = System.currentTimeMillis();
for (String s : list) {
ss=ss.concat(s);
}
System.out.println(System.currentTimeMillis() - startTime);
}
@org.junit.Test
public void test3() {
StringBuilder ss = new StringBuilder();
long startTime = System.currentTimeMillis();
for (String s : list) {
ss.append(s);
}
System.out.println(System.currentTimeMillis() - startTime);
}
@org.junit.Test
public void test4() {
long startTime = System.currentTimeMillis();
StringUtils.join(list);
System.out.println(System.currentTimeMillis() - startTime);
}
@org.junit.Test
public void test5() {
StringBuffer ss = new StringBuffer();
long startTime = System.currentTimeMillis();
for (String s : list) {
ss.append(s);
}
System.out.println(System.currentTimeMillis() - startTime);
}
}
第一种:33809
第二种:8851
第三种:6
第四种:12
第五种:7
性能:StringBuilder>StringBuffer>StringUtils.join>concat>+
然后从源码层面分析下
StringBuilder:
每次字符串拼接都只是扩展内部char数组,只生产一个最终的string,所以这种效率最高
StringBuffer:
与StringBuilder相比只是多加了个synchronized,所以在单线程的情况下相差不大
StringUtils.join:
可以看到其内部还是用StringBuilder实现,但是每次循环都多了个分隔符的判断所以慢了一点,但是也不多,时间上来讲是一个数量级的
concat:
可以看出每次连接都会生成一个string,所以效率很低
+:
因为是重载的运算符,找不到源码,但是从结果来看效率最低
来源:https://www.jianshu.com/p/c49c0f6f3b75


猜你喜欢
- 这是一个自定义view画圆,对于初学自定义view的小伙伴这是一个很好的帮助。 看图代码:package sjx.com.custonvie
- 1.构建springboot项目2.打包应用3.编写dockerfile4.构建镜像5.发布运行![root@localhost demo]
- 当一个activity中含有输入框时,我们点击输入框,会弹出输入法界面,整个界面的变化效果与manifest中对应设置的andr
- 前言在有些业务场景中,系统对于响应时间有一定的要求,而一个方法里面同步执行的业务逻辑太多势必会影响响应速度,带来不好的用户体验。比如登录时记
- java超市管理系统 1.0(含源文件,后续会继续优化~)前言一个月零零散散的时间学习了java,通过这次“超市管理系统”的练习,希望可以给
- 1、前言Android Studio对模块化开发提供的一个很有用的功能就是可以在主项目下新建库项目(Module),但是在使用库项目时却有一
- 在日常工作中,我们可能需要连接多个MongoDB数据源,比如用户库user,日志库log。本章我们来记录连接多个数据源的步骤,以两个数据源为
- 实验目的在C#和Rest/Restful以及其它的Web服务交互过程中,大量使用到JSON传递数据,如何快捷的转化C#对象到JSON和转化J
- 前几天,公司数据库出现了两条相同的数据,而且时间相同(毫秒也相同)。排查原因,发现是网络波动造成了重复提交。由于网络波动而重复提交的例子也比
- 在前面的文章<Mybatis配置之<properties>属性配置元素详述>,我们讲述了<properties
- 项目中常用到的圆形进度条有好多个,从网上搜到的自定义进度条多是封装的比较好的代码,但是不利于初学者,现在本博客就教给大家如何一步步实现自定义
- 前言记一次为了节省代码没有在方法体中声明HttpServletRequest,而用autowire直接注入所钻的坑结论:给心急的人。 直接在
- 1.内容中含有xml预定好的实体,如“<”和“&”,对xml来说是禁止使用的,针对这种字符,解决方式是使用CDATA部件以&q
- 本文实例为大家分享了android通过NFC读取卡号的具体代码,供大家参考,具体内容如下1.获取权限<uses-permission
- 前言该篇文章主要总结的是自己平时工作中使用频率比较高的Xml文档操作的一些常用方法和收集网上写的比较好的一些通用Xml文档操作的方法(主要包
- 最近项目需要,需要做一个BMI指数的指示条,先上效果图: BMI指数从18到35,然后上面指示条的颜色会随着偏移量的变化而改变,数字显示当前
- 一、NIOjava.nio全称java non-blocking IO,是指jdk1.4 及以上版本里提供的新api(New IO) ,为所
- mybatis-plus想要修改某字段为null问题场景使用mybatis + mybatisPlus进行修改某字段,想要将其设为null,
- 最近在做项目的过程中 需要用JWT做登录和鉴权 查了很多资料 都不甚详细有的是需要在application.yml里进行jwt的配置 但我在
- 很多情况下sql不好解决的多表查询,临时表分组,排序,尽量用java8新特性stream进行处理使用java8新特性,下面先来点基础的Lis