StringBuilder字符串连接性能优化(参考阿里巴巴Java开发手册规范处理)
查看阿里巴巴开发手册,使用StringBuilder进行资源拼接,否则造成资源的浪费

String与StringBuilder与StringBuffer区别
继承关系

| String | StringBuffer | StringBuilder |
|---|
| 线程安全 | 线程安全 | 线程不安全 |
| 执行速度最慢 | 执行速度其次 | 执行速度最快 |
| 不可变的字符串序列 | 可变的字符串序列 | 可变的字符串序列 |
为什么StringBuilder是线程不安全的?
因为StringBuilder在append操作时并未使用线程同步,而StringBuffer几乎大部分方法都使用了synchronized关键字进行方法级别的同步处理。
测试一下他们之间的耗时
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| public static void main(String[] args) { long startTime = System.currentTimeMillis(); String str = "start"; for (int i = 0; i < 100000; i++) { str = str + "hello"; } System.out.println(System.currentTimeMillis() - startTime); long startTime1 = System.currentTimeMillis(); StringBuilder strBuilder = new StringBuilder("start"); for (int i = 0; i < 100000; i++) { strBuilder = strBuilder.append("hello"); } System.out.println(System.currentTimeMillis() - startTime1); }
|
当您定义这个变量时,根据Java的对象池机制,JVM-JAVA虚拟机会在内存的堆栈中的某一个地址分配一个字符串常量 start , 因此是不可以继续追加的,当使用 ‘+’后相当于生成了一个新的字符串常量。
多次测试发现 String直接连接的方式真的太耗时了!!!



使用更精确的时间再次测试
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| int count = 50;
long startTime = System.nanoTime(); StringBuilder strBuilder = new StringBuilder(); for (int i = 0; i < count; i++) { strBuilder.append("1"); } System.out.println("耗时=>" + (System.nanoTime() - startTime));
long startTime1 = System.nanoTime(); String str = new String(); for (int i = 0; i < count; i++) { str = str + "1"; } System.out.println("耗时=>" + (System.nanoTime() - startTime1));
|
1 2 3 4 5 6 7 8
| 耗时=>29858 耗时=>27652
耗时=>21414 耗时=>28042
耗时=>29641 耗时=>53310
|
循环数小时测试

循环数小的时候,我们可以发现String的拼接比StringBuilder耗时小的多,当循环数大的时候使用String耗时严重
- 当循环次数大且非多线程情况时推荐使用StringBuilder
- 当循环次数大且多线程情况时推荐使用StringBuffer
- 当循环次数小情况时推荐使用String
阿里JAVA开发手册地址
手册阿里云盘链接:https://www.aliyundrive.com/s/MEtW4t5DdGh