连接n个字符串而重复的使用+,需要n的平方级别的时间?为什么?
2013-11-05 22:33
344 查看
Efftive Java第51条: 当心字符串连接的性能,当连接n个字符串而重复地使用字符串连接操作,需要n的平方级的时间。
原因:字符串不可变,所以当两个字符串被连接在一起时,它们的内容都需要拷贝。
结论:当需要做多个字符串连接操作时,为了提高性能,应该使用StringBuilder的append方法,如果没有同步(单线程)问题也可以用StringBuffer类的append方法。
问题:为什么为连接n个字符串而重复的使用+,需要n的平方级别的时间?
证明:
第一次 a1+a2
拷贝次数 1 1
a1a2=a1+a2 共计1+1+1=3次
第二次 a1a2 + a3
拷贝次数 2 1
a1a2a3 = a1+a2+a3 共计 1+2+2*1+1=6次
第三次 a1a2a3 + a4
拷贝次数 3 1
a1a2a3 = a1+a2+a3 共计1+2+3+3*1+1=10次
依此类推
第n次 a1a2...a(n-1) + a(n)
拷贝次数 n-1 1
a1a2...a(n-1)a(n) 共计 1+2+3+(n-1)+1 = 1+2+3+(n-1)+n = n*(n+1)/2
以a1+a2+a3的连接为例,具体过程图解如下:
上面过程为我自己琢磨的,如果理解有错,望指证。
原因:字符串不可变,所以当两个字符串被连接在一起时,它们的内容都需要拷贝。
结论:当需要做多个字符串连接操作时,为了提高性能,应该使用StringBuilder的append方法,如果没有同步(单线程)问题也可以用StringBuffer类的append方法。
问题:为什么为连接n个字符串而重复的使用+,需要n的平方级别的时间?
证明:
第一次 a1+a2
拷贝次数 1 1
a1a2=a1+a2 共计1+1+1=3次
第二次 a1a2 + a3
拷贝次数 2 1
a1a2a3 = a1+a2+a3 共计 1+2+2*1+1=6次
第三次 a1a2a3 + a4
拷贝次数 3 1
a1a2a3 = a1+a2+a3 共计1+2+3+3*1+1=10次
依此类推
第n次 a1a2...a(n-1) + a(n)
拷贝次数 n-1 1
a1a2...a(n-1)a(n) 共计 1+2+3+(n-1)+1 = 1+2+3+(n-1)+n = n*(n+1)/2
以a1+a2+a3的连接为例,具体过程图解如下:
上面过程为我自己琢磨的,如果理解有错,望指证。
相关文章推荐
- 问题一:编写函数stringcat,实现字符串的连接,程序中需要使用指针形式访问字符串
- 为什么改变字符串中的字符需要使用引用
- 使用linux的shell脚本实现在当前行重复动态显示时间等字符串信息(不另起新行)
- 问题九:编写函数stringcat,实现字符串的连接,程序中需要使用指针形式访问字符串
- Sql常见问题总结二(Sql语句怎么样查询IP,游标去重复,各种函数使用,各种取时间格式,字符串精确排序,超时锁问题)
- 连接字符串中Min Pool Size的理解是错误,超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小。
- oracle字符串连接和时间格式处理(附加Calendar简单使用)
- Sql常见问题总结二(Sql语句怎么样查询IP,游标去重复,各种函数使用,各种取时间格式,字符串精确排序,超时锁问题)
- 使用linux的shell脚本实现在当前行重复动态显示时间等字符串信息(不另起新行)
- 【Java性能】你需要知道的:Java字符串连接使用"+"和StringBuilder性能比较
- C#实现多级子目录Zip压缩解压实例 NET4.6下的UTC时间转换 [译]ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了 asp.Net Core免费开源分布式异常日志收集框架Exceptionless安装配置以及简单使用图文教程 asp.net core异步进行新增操作并且需要判断某些字段是否重复的三种解决方案 .NET Core开发日志
- java 为什么说,不推荐使用+来连接字符串?
- 时间处理工具类,和使用字符串或者日期处理需要注意的问题
- 【转】android中重复连接ble设备导致的连接后直接返回STATE_DISCONNECTED的解决办法---不错不错,重新连接需要花费很长的时间
- Java中尽量使用StringBuilder和StringBuffer进行字符串连接
- 为什么 web 开发人员需要迁移到. NET Core, 并使用 ASP.NET Core MVC 构建 web 和 webservice/API
- MS SQL_使用for xml path 将1列多行转换为字符串连接起来
- 关于为什么需要在项目里使用TexturePacker
- 相同设备连接为什么使用交叉线?
- XP远程桌面连接2008提示:远程计算机需要网络级别身份验证,而您的计算机不支持该验证