博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
常见字符串拼接性能比较
阅读量:6323 次
发布时间:2019-06-22

本文共 2995 字,大约阅读时间需要 9 分钟。

hot3.png

今天在项目里,用了下String.format来格式化字符串,这样写好处时代码量少了那么一点且比较直观,但想想,为啥很少地方有用,是不是性能不好?然后写了以下的代码,比较下常用拼接方法的性能比较。

public class Test{	public static void main(String[] args){		long st = 0l,et=0l;		st= System.nanoTime();		for(int i=0;i<100000;i++){			Test.format("Tim",12);		}		et= System.nanoTime();		System.out.println("format "+(et-st)/1000000+"ms");						st= System.nanoTime();		for(int i=0;i<100000;i++){			Test.plus("Tim",12);		}		et= System.nanoTime();		System.out.println("plus "+(et-st)/1000000+"ms");					st= System.nanoTime();		for(int i=0;i<100000;i++){			Test.concat("Tim",12);		}		et= System.nanoTime();		System.out.println("concat "+(et-st)/1000000+"ms");					st= System.nanoTime();		for(int i=0;i<100000;i++){			Test.builder("Tim",12);		}		et= System.nanoTime();		System.out.println("builder "+(et-st)/1000000+"ms");					st= System.nanoTime();		for(int i=0;i<100000;i++){			Test.buffer("Tim",12);		}		et= System.nanoTime();		System.out.println("buffer "+(et-st)/1000000+"ms");		}		static String format(String name,int age){		return String.format("我叫%s,今年%d岁",name,age);	}		static String plus(String name,int age){		return "我叫"+name+",今年"+age+"岁";	}		static String concat(String name,int age){		return "我叫".concat(name).concat(",今年").concat(String.valueOf(age)).concat("岁");	}		static String builder(String name,int age){		StringBuilder sb=new StringBuilder();		sb.append("我叫").append(name).append(",今年").append(age).append("岁");		return sb.toString();	}		static String buffer(String name,int age){		StringBuffer sb=new StringBuffer();		sb.append("我叫").append(name).append(",今年").append(age).append("岁");		return sb.toString();	}}

测试结果是:

format 331msplus 21msconcat 18msbuilder 12msbuffer 22ms

除了String.format外,其他都在意料之内。String.format的耗时也太超出想像了吧。

然后看了下实现的代码。

public Formatter format(Locale l, String format, Object ... args) {	ensureOpen();	// index of last argument referenced	int last = -1;	// last ordinary index	int lasto = -1;	FormatString[] fsa = parse(format);	for (int i = 0; i < fsa.length; i++) {	    FormatString fs = fsa[i];	    int index = fs.index();	    try {		switch (index) {		case -2:  // fixed string, "%n", or "%%"		    fs.print(null, l);		    break;		case -1:  // relative index		    if (last < 0 || (args != null && last > args.length - 1))			throw new MissingFormatArgumentException(fs.toString());		    fs.print((args == null ? null : args[last]), l);		    break;		case 0:  // ordinary index		    lasto++; 		    last = lasto;		    if (args != null && lasto > args.length - 1)			throw new MissingFormatArgumentException(fs.toString()); 		    fs.print((args == null ? null : args[lasto]), l);		    break;		default:  // explicit index		    last = index - 1;		    if (args != null && last > args.length - 1)			throw new MissingFormatArgumentException(fs.toString()); 		    fs.print((args == null ? null : args[last]), l);		    break;		}	    } catch (IOException x) {		lastException = x;	    }	}	return this;    }
看到这里感觉性能问题也没多大的意外了。

转载于:https://my.oschina.net/hand515/blog/100049

你可能感兴趣的文章
针对Kubernetes软件栈有状态服务设计的思考
查看>>
第八章 进程间通信
查看>>
CentOS 7 巨大变动之 firewalld 取代 iptables
查看>>
教你如何使用Flutter和原生App混合开发
查看>>
订单的子单表格设置颜色
查看>>
lvs fullnat部署手册(三)rs内核加载toa篇
查看>>
iframe 在ie下面总是弹出新窗口解决方法
查看>>
android编译系统makefile(Android.mk)写法
查看>>
MD5源代码C++
查看>>
Eclipse 添加 Ibator
查看>>
Linux中变量$#,$@,$0,$1,$2,$*,$$,$?的含义
查看>>
男人要内在美,更要外在美
查看>>
为什么要跟别人比?
查看>>
app启动白屏
查看>>
Hadoop集群完全分布式安装
查看>>
QString,char,string之间赋值
查看>>
MySql之基于ssl安全连接的主从复制
查看>>
informix的逻辑日志和物理日志分析
查看>>
wordpress admin https + nginx反向代理配置
查看>>
centos 5.5 64 php imagick 模块错误处理记录
查看>>