字符串拼接方式

转载自 java提高篇之字符串

对于字符串而言我们经常是要对其进行拼装处理的,在java中提高了三种拼装的方法:+、concat()以及append()方法。这三者之间存在什么区别呢?先看如下示例:

public class StringTest {/*** @desc 使用+、concat()、append()方法循环10W次* @author chenssy* @data 2013-11-16* @param args* @return void*/public static void main(String[] args) {//+long start_01 = System.currentTimeMillis();String a = "a";for(int i = 0 ; i < 100000 ; i++){a += "b";}long end_01 = System.currentTimeMillis();System.out.println("  +   所消耗的时间:" + (end_01 - start_01) + "毫米");//concat()long start_02 = System.currentTimeMillis();String c = "c";for(int i = 0 ; i < 100000 ; i++){c = c.concat("d");}long end_02 = System.currentTimeMillis();System.out.println("concat所消耗的时间:" + (end_02 - start_02) + "毫米");//appendlong start_03 = System.currentTimeMillis();StringBuffer e = new StringBuffer("e");for(int i = 0 ; i < 100000 ; i++){e.append("d");}long end_03 = System.currentTimeMillis();System.out.println("append所消耗的时间:" + (end_03 - start_03) + "毫米");}
}
Output:
  +   所消耗的时间:19080毫米
concat所消耗的时间:9089毫米
append所消耗的时间:10毫米

从上面的运行结果可以看出,append()速度最快,concat()次之,+最慢。原因请看下面分解:

(1)+方式拼接字符串

在前面我们知道编译器对+进行了优化,它是使用StringBuilder的append()方法来进行处理的,我们知道StringBuilder的速度比StringBuffer的速度更加快,但是为何运行速度还是那样呢?主要是因为编译器使用append()方法追加后要同toString()转换成String字符串,也就说  str +=”b”等同于

str = new StringBuilder(str).append(“b”).toString();

它变慢的关键原因就在于new StringBuilder()和toString(),这里可是创建了10W个StringBuilder对象,而且每次还需要将其转换成String,速度能不慢么?

(2)concat()方法拼接字符串

public String concat(String str) {int otherLen = str.length();if (otherLen == 0) {return this;}char buf[] = new char[count + otherLen];getChars(0, count, buf, 0);str.getChars(0, otherLen, buf, count);return new String(0, count + otherLen, buf);}

这是concat()的源码,它看上去就是一个数字拷贝形式,我们知道数组的处理速度是非常快的,但是由于该方法最后是这样的:return new String(0, count + otherLen, buf);这同样也创建了10W个字符串对象,这是它变慢的根本原因。

(3)append()方法拼接字符串

public synchronized StringBuffer append(String str) {super.append(str);return this;}

StringBuffer的append()方法是直接使用父类AbstractStringBuilder的append()方法,该方法的源码如下:

public AbstractStringBuilder append(String str) {if (str == null) str = "null";int len = str.length();if (len == 0) return this;int newCount = count + len;if (newCount > value.length)expandCapacity(newCount);str.getChars(0, len, value, count);count = newCount;return this;}

与concat()方法相似,它也是进行字符数组处理的,加长,然后拷贝,但是请注意它最后是返回并没有返回一个新串,而是返回本身,也就说这这个10W次的循环过程中,它并没有产生新的字符串对象。

通过上面的分析,我们需要在合适的场所选择合适的字符串拼接方式,但是并不一定就要选择append()和concat()方法,原因在于+根据符合我们的编程习惯,只有到了使用append()和concat()方法确实是可以对我们系统的效率起到比较大的帮助,才会考虑,同时鄙人也真的没有怎么用过concat()方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/330523.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用js比较时间大小

开发工具与关键技术&#xff1a;Visual Studio、js 作者&#xff1a;幻奏 撰写时间&#xff1a;2019.7.17对比时间的大小在很多项目里面都有用到&#xff0c;刚开始我还不会怎样比较时间的大小&#xff0c;后来上了老师的课之后&#xff0c;我才知道怎样比较时间的大小。 比较时…

独家:这也许是最具珍藏价值的Oracle DBA生存宝典!

转自&#xff1a; https://dbaplus.cn/news-10-1475-1.html 曾几何时&#xff0c;DBA一度被视为越老越吃香的职业&#xff0c;而从事数据库霸主Oracle的DBA更是风靡多时的技术人择业之选。 但随着Oracle自身技术的不断提升和完善&#xff0c;人手的操作不断被削弱&#xff0c;O…

StringTokenizer的使用

转载自 Java学习笔记--StringTokenizer的使用拓展&#xff1a;Pattern.split替代String.split http://www.cnblogs.com/gnivor/p/4386978.html StringTokenizer是一个用来分隔String的应用类 &#xff11;. 构造函数。1. StringTokenizer(String str) &#xff1a;构造一个用来…

Post请求如何取消异步

开发工具与关键技术&#xff1a;Visual Studio、post 作者&#xff1a;幻奏 撰写时间&#xff1a;2019.7.22其实关于异步这个问题我还不太懂&#xff0c;因为我还是一只萌新嘛&#xff0c;所以我在做项目时就出现了一个关于异步的问题。 我做的项目是一个客房管理系统&#xff…

Oracle必读好书推荐

转自&#xff1a;https://blog.csdn.net/notbaron/article/details/52305255 Oracle必读好书推荐 -------------------------------------------------------------------------- tkyte的书 1、Expert Oracle Database Architecture: 9i and 10g Programming Techniques and…

如何在linq使用左连接

开发工具与关键技术&#xff1a;Visual Studio、linq 作者&#xff1a;幻奏 撰写时间&#xff1a;2019.7.26我先说一下我的项目吧&#xff0c;上次就已经提过了&#xff0c;我做的是酒店的客房管理系统&#xff0c;首先要实现的是房态图&#xff0c;这个是根据房间的数量来新增…

Maven精选系列--私库搭建及使用

转载自 Maven精选系列--私库搭建及使用为什么要使用私库maven默认去远程中央仓库下载JAR包的&#xff0c;访问国外网络相当慢&#xff0c;如果团队每个人都去下载一遍无疑是网络的浪费&#xff0c;当然也可以添加国内的镜像&#xff0c;如阿里的比较稳定&#xff0c;但如果想添…

学习Oracle 最好的5本书

转自&#xff1a; http://www.goodu.info/gc/node/88 经过精心搜集和统计&#xff0c;这里列出了学习Oracle最好的5本书&#xff0c;从入门到精通从简单理解到高级技巧&#xff0c;涵盖了历年来最佳学习实践经验。快速帮助成为Oracle达人。 都是响当当的作者&#xff0c;响当当…

学好数据库,看这9本书就够了

转自&#xff1a; https://blog.csdn.net/f2006116/article/details/51997820 软件开发者编写代码&#xff0c;最终都是要处理数据&#xff0c;因此数据库是必备技能。 悲剧的是&#xff0c;学校里与此最相关的数据库原理课&#xff0c;对初学者的体验却非常不好。相信很多同学…

SuperMap GIS查询

SuperMap GIS的二次开发是在地图的基础上开发使用一些功能&#xff0c;让人更加方便的使用地图。功能中当然有查询&#xff0c;而查询分类有&#xff1a;1、地图查询 2、数据查询。 地图查询主要针对地图中的数据进行的各类查询&#xff1a;SQL查询、范围查询、距离查询、几何查…

Maven精选系列--发布jar包到Nexus私库

转载自 Maven精选系列--发布jar包到Nexus私库Nexus2可以通过管理界面来上传jar包到私库中&#xff0c;而最新的Nexus3却找不到了上传界面&#xff0c;只能通过以下方式来发布到私库。 发布第三方jar包 这种情况是maven远程仓库没有&#xff0c;本地有的第三方jar包&#xff0c;…

学习PL/SQL最好的书籍推荐

转自&#xff1a; https://searchdatabase.techtarget.com.cn/7-18731/ 问&#xff1a;我的问题十分简单。请您推荐几本学习PL/SQL比较好的书(我有一定的SQL经验)&#xff0c;最好不要太多。我有很多年的IT从业经验&#xff0c;对与RPG以及COBOL编程比较熟悉&#xff0c;其它的…

数据结构和算法的基本概念

我们要想开发出高效率的软件就要建立合适的数据结构和设计较好的算法来提高程序执行效率&#xff0c;而学习数据结构和算法的目的就是提高程序执行效率。 “算法数据结构程序”这是某位科学家的观点。 首先是数据结构&#xff0c;数据结构有俩种1、逻辑结构2、物理结构。 数据与…

Maven精选系列--三种仓库详解

转载自 Maven精选系列--三种仓库详解仓库分类1、本地仓库本地仓库就是开发者本地已经下载下来的或者自己打包所有jar包的依赖仓库&#xff0c;本地仓库路径配置在maven对应的conf/settings.xml配置文件。<!-- localRepository| The path to the local repository maven will…

【VB测绘程序设计】案例4——简单的四则运算练习Select Case语句的使用(附源码)

【VB测绘程序设计】案例4——简单的四则运算练习(附源码) 文章目录 前言一、界面预览二、程序介绍总结前言 在新手学习VB程序设计中,四则运算是基础,通过设计的TexT、按钮、label等控件,定义变量,实现简单程序的编写,提高对VB程序的入门训练。 一、界面预览 二、程序介…

大牛书单 | 数据库专题好书分享

转自&#xff1a; https://cloud.tencent.com/developer/article/1352074 导语&#xff1a;读书是一生的功课&#xff0c;技术人通过读书实现自我提升&#xff0c;学习优秀技术沉淀。TEG读书会本期特邀腾讯金融云专家工程师李海翔、TEG计费平台部专家工程师雷海林、MySQL数据库…

Maven精选系列--依赖范围、传递、排除

转载自 Maven精选系列--依赖范围、传递、排除添加依赖下面我添加了一个spring-web的依赖&#xff0c;maven就会去下载spring-web的jar包及它依赖的一些jar包。<dependencies><dependency><groupId>org.springframework</groupId><artifactId>spr…

互联网的基本概念

现在大家都在使用互联网&#xff0c;但是它的概念你们大概不知道吧&#xff0c;下面我就大概说一下互联网的基本概念。 互联网指Internet,起源于美国&#xff0c;现已发展成为世界上最大的&#xff0c;覆盖全球的计算机网络。计算机网络&#xff08;简称为网络&#xff09;&…

Maven精选系列--继承与聚合

转载自 Maven精选系列--继承与聚合继承什么是继承&#xff0c;我们可以定义项目的父类项目&#xff0c;用于继承父项目的依赖、插件、属性等信息。<parent> <groupId>com.alibaba</groupId> <artifactId>dubbo-parent</artifactId> <version&…