学习String,StringBuffer,StringBuilder之前我们需要对String在JVM中的存储结构有初步了解。
(153条消息) Java String在JVM中的内存模型_TGO-Ming的博客-CSDN博客
在项目的开发过程做我们经常有对String字符串有修改操作的情况,这里记录一下开发过程做因为String值平凡变更导致影响效率的情况
- String叠加字符串效率
代码示例:
运行情况:
JVM中资源消耗情况这里我们主要关注堆内存和CPU
使用堆内存:259.9 MB, 提交:785.9 MB, 最大: 1.9 GB
CPU占用率:13.1%
- StringBuffer叠加字符串效率
代码示例:
运行情况
JVM中资源消耗情况这里我们主要关注堆内存和CPU
使用堆内存:19.8MB, 提交:129 MB, 最大: 1.9 GB
CPU占用率:0.5%
- StringBuilder叠加字符串效率
代码示例:
运行情况:
JVM中资源消耗情况这里我们主要关注堆内存和CPU
使用堆内存:19.1MB, 提交:129 MB, 最大: 1.9 GB
CPU占用率:0.1%
字符串叠加方法 | 堆内存使用量 | 堆内存提交 | 最大堆内存 | CPU占用率 | 运行耗时 |
String | 259.9 MB | 785.9 MB | 1.9 GB | 13.1% | 42141 ms |
StringBuffer | 19.8MB | 129 MB | 1.9 GB | 0.5% | 73 ms |
StringBuilder | 19.1MB | 129 MB | 1.9 GB | 0.1% | 53 ms |
总结:
String:不论是CPU还是堆内存的耗费都是最大,原因就在于,String的每次叠加都会导致在常量池中创建全新的字符串,而上一次的字符串也同样存在于常量池中,如此迭代,导致常量池中存在大量的垃圾字符串,没有GC之前会占用大量的存储空间。由于不断创建全新的字符串在常量池中,所以它的CPU占用率和耗时都是最高的。而StringBuffer和StringBuilder 就不会不断创建全新字符串,而是单纯的做字符串叠加。
StringBuffer:可以看到他的内存空间的消耗和StringBuilder是相当的,只是CPU占用率高了些,同时耗时也高一些(经过多次测试均是这个结果)。那么为什么Buffer效率要略微低于StringBuilder呢?原因就在于Buffer是线程安全的而Bilder是线程不安全的,我们这里对比一下就知道了,如下
Buffer在每次叠加都需要上锁,会耗费一定资源。