网站首页 > java教程 正文
字符串是 Java程序中最常用的数据结构之一,字符串连接又是经常使用到的。Java中有多种方式可以实现字符串的连接,如直接使用“+”连接两个String对象、StringBuilder的append()方法、String的concat()方法。今天,我们对比一下这几种方式的执行速度并分析下原因。
测试代码:
public class TestMain {
public static void main(String[] args){
String str1 = "str";
long start1 = System.currentTimeMillis();
for(int i=0;i<500000;i++){
str1 += "a";
}
long end1 = System.currentTimeMillis();
System.out.println("+的执行时间"+(end1 - start1)+"毫秒");
System.out.println();
String str2 = "str";
long start2 = System.currentTimeMillis();
for(int i=0;i<500000;i++){
str2.concat("a");
}
long end2 = System.currentTimeMillis();
System.out.println("concat的执行时间"+(end2 - start2)+"毫秒");
System.out.println();
StringBuilder str3 =new StringBuilder("str2:");
long start3 = System.currentTimeMillis();
for(int i=0;i<500000;i++){
str3.append("a");
}
long end3 = System.currentTimeMillis();
System.out.println("append的执行时间"+(end3 - start3)+"毫秒");
}
}
复制代码
执行结果:
从结果中很明显的看出,“+”拼接的效率要远远低于concat()方法和append()方法。为什么?“+”方法拼接字符串本质上是调用的StringBuilder的append()方法,在通过toString()方法返回字符串的,但是它是这样调用的 new StringBuilder().append(str).toString(),就是说我们执行了500000次“+”拼接,它就new了500000次StringBuilder对象并调用了500000次toString()方法转换为字符串,这是耗时的主要原因。
我们再看一下append()方法和concat()方法的源码实现:
public AbstractStringBuilder append(StringBuffer sb) {
if (sb == null)
return appendNull();
int len = sb.length();
//扩容
ensureCapacityInternal(count + len);
//调用System.arraycopy(),数组复制
sb.getChars(0, len, value, count);
count += len;
return this;
}
...
public String concat(String str) {
int otherLen = str.length();
if (otherLen == 0) {
return this;
}
int len = value.length;
char buf[] = Arrays.copyOf(value, len + otherLen);
str.getChars(buf, len);
return new String(buf, true);
}
复制代码
在源码中不难发现,append()方法和concat()方法都是对字符数组加长然后复制,中间没有产生任何对象,所以效率会高。
尽管如此,也并不是所有情况都不用“+”方法,实际开发中,我们经常会有一两个字符串的拼接,这个时候还是建议使用“+”方法的,至少它比较符合人们的阅读习惯,代码也显得简洁。只是在进行较大量的字符串拼接时,还是尽量使用append()方法吧。
微信公众号:程序员Mark Chou
猜你喜欢
- 2024-10-18 java面试题之三:字符串操作(字符串笔试题java)
- 2024-10-18 Jmeter BeanShell循环:字符串 拼接模式,为变量名 获取数据值
- 2024-10-18 连接字符串除了“+”还有哪些方法,进来看
- 2024-10-18 初识java—(三十四)String、StringBuffer和StringBuilder类
- 2024-10-18 初学者都在坑里!不要在Python中使用“+”来连接字符串
- 2024-10-18 一段简单的关于字符串的Java 代码,竟然考察了这么多东西
- 2024-10-18 Java中字符串连接运算符“+”的困惑
- 2024-10-18 Guava之字符串连接,分割,匹配处理
- 2024-10-18 【老梁聊IT之JAVA篇】StringBuilder的正确使用方法详解
- 2024-10-18 为何Java8中不再需要StringBuilder拼接字符串
你 发表评论:
欢迎- 07-15采用Oracle OSB总线进行服务注册和接入
- 07-15javaEE 新闻管理系统 oracle11+tomcat6
- 07-15从Oracle演进看数据库技术的发展(oracle数据库发展史)
- 07-15如何升级oracle数据库安全补丁(oraclepsu补丁升级)
- 07-15【权威发布】关于Oracle WebLogic Server未授权远程代码执行高危漏洞的预警通报
- 07-15【mykit-data】 数据库同步工具(数据库表同步工具)
- 07-15[Java速成] 数据库基础,Connector/J、JDBC、JPA的关系(day 7)
- 07-15Google前工程主管“入住”Oracle(google浏览器找不到以前的书签)
- 最近发表
-
- 采用Oracle OSB总线进行服务注册和接入
- javaEE 新闻管理系统 oracle11+tomcat6
- 从Oracle演进看数据库技术的发展(oracle数据库发展史)
- 如何升级oracle数据库安全补丁(oraclepsu补丁升级)
- 【权威发布】关于Oracle WebLogic Server未授权远程代码执行高危漏洞的预警通报
- 【mykit-data】 数据库同步工具(数据库表同步工具)
- [Java速成] 数据库基础,Connector/J、JDBC、JPA的关系(day 7)
- Google前工程主管“入住”Oracle(google浏览器找不到以前的书签)
- Oracle数据库云服务系列新增前所未有的企业级功能
- 直播预告丨如何实现Oracle存储过程到java的一键转化
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)