老生常谈之Java字符串拼接
2015-12-10 14:44
393 查看
本文讲解Java语言中常见的几种字符串拼接方式的特点及其使用情形。
若”+”操作符的底层实现是用Java写的,预测其中一部分可能长这个样:
理论上,此时拼接效率应该最高,因为已经假定两个量都为字符串,做底层优化不需要额外判断或转换,而其他方式无论如何优化,都要先走到这一步。
当a,b,c拼接起来会很长时,可以给在构造器中传入一个合适的预估容量以减少因扩展缓冲空间而带来的性能开销。
JDK对外提供的一些涉及可append CharSequence的参数或返回值类型往往是StringBuffer类型,毕竟安全第一,而StringBuffer大多数情况(包括append操作)线程安全。
若不会出现多线程同时对一实例并发进行append操作,建议使用非线程安全的StringBuilder以获得更好性能
此时,第4句经JDK编译后其字节码(或)会自动优化为等效于下列代码编译后的字节码。
若采用模板+参数来替换占位符的方式或需同时对要拼接日期/数字进行格式化,可以用String.format()来实现
此方式资源占用/耗时相对会稍多,毕竟首先要解析模板。当用方法封装并进行format条件调用时,整体效率也不算差。
既然高效(高速,低耗)、简洁(简短,易读)、灵活(易改)难以兼得,我们能做的就是:看情况,作取舍。
作者经验水平有限,以上内容若已过时,敬请指出。
1. plus方式
当左右两个量其中有一个为String类型时,用plus方式可将两个量转成字符串并拼接。String a=""; int b=0xb; String c=a+b;
若”+”操作符的底层实现是用Java写的,预测其中一部分可能长这个样:
native int plus(int a,int b); native double plus(double a,double b); //...(plus重载) String plus(String a,Object b){ return String.valueOf(a).concat(String.valueOf(b)); } String plus(Object a,String b){ return String.toString(a).concat(String.valueOf(b)); }
2. concat方式
当两个量都为String类型且值不为null时,可以用concat方式。String a="a"; String b="b"; String c= a.concat(b);
理论上,此时拼接效率应该最高,因为已经假定两个量都为字符串,做底层优化不需要额外判断或转换,而其他方式无论如何优化,都要先走到这一步。
3. append方式
当需要拼接至少三个量的时候,可以考虑使用StringBuffer#append()以避免临时字符串的产生StringBuffer buf=new StringBuffer() buf.append("a"); if(someCondition){ buf.append("b"); } buf.append("c"); String d=buf.toString();
当a,b,c拼接起来会很长时,可以给在构造器中传入一个合适的预估容量以减少因扩展缓冲空间而带来的性能开销。
StringBuffer buf=new StringBuffer(a.length()+b.length()+c.length());
JDK对外提供的一些涉及可append CharSequence的参数或返回值类型往往是StringBuffer类型,毕竟安全第一,而StringBuffer大多数情况(包括append操作)线程安全。
若不会出现多线程同时对一实例并发进行append操作,建议使用非线程安全的StringBuilder以获得更好性能
4. 其他
若需拼接至少三个量,只用一个连续拼接的语句就可完成时,从使代码简洁角度考虑,用plus方式。String a="a"; String b="b"; String c="c"; String d=a+b+c;
此时,第4句经JDK编译后其字节码(或)会自动优化为等效于下列代码编译后的字节码。
String d=new StringBuilder().append(a).append(b).append(c).toString();
若采用模板+参数来替换占位符的方式或需同时对要拼接日期/数字进行格式化,可以用String.format()来实现
String c=String.format("a %s!","b");
此方式资源占用/耗时相对会稍多,毕竟首先要解析模板。当用方法封装并进行format条件调用时,整体效率也不算差。
总结
上述几种字符串拼接方式各有特长,很难单说谁谁谁更好。既然高效(高速,低耗)、简洁(简短,易读)、灵活(易改)难以兼得,我们能做的就是:看情况,作取舍。
作者经验水平有限,以上内容若已过时,敬请指出。
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android之获取手机上的图片和视频缩略图thumbnails
- android string.xml文件中的整型和string型代替
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- 安装nginx-http-concat 减少http请求
- 插入排序
- 冒泡排序