概述
- StringBuffer就是为了解决大量拼接字符串时产生很多中间对象问题而提供的一个类,提供append和add方法,可以将字符串添加到已有序列的末尾或指定位置,它的本质是一个线程安全的可修改的字符序列,把所有修改数据的方法都加上synchronized。但是保证了线程安全是需要性能的代价的。
- StringBuilder是JDK1.5发布的,它和StringBuffer本质上并没有什么区别,就是去掉了保证线程安全的那部分,减少了开销。
相同点、不同点

实际上StringBuffer就是一个加锁的StringBuilder,其它的除了那个缓冲区,没什么区别,他们就相当于一个壳子,实际上调用的是他们父类中的方法,来进行操作那个char[]数组的。
字符串拼接
这个要明白String是final修饰的,正是因为它的不可变性,所以例如拼接字符串时候会产生很多无用的中间对象,如果频繁的进行这样的操作对性能有所影响。
1 | public class Test { |

这种情况编译器会直接带代码进行优化为 String a = “abc” 无需额外的操作,看字节码astore就知道直接存入局部变量表1的位置。(0的位置是args数组)
1 | public class Test { |

这种编译器自然就没办法进行优化,但是JVM会帮助你做相关的优化,字节码中可以看出JVM中new StringBuilder操作append()方法拼接的字符串。
这里并未出现new多次StringBuilder这个现象,我看网上的好多都说这个操作会出现new 多个StringBuilder对象,这个?????。难道是JVM更加的优化了这个,还是有的我并不了解,待研究,遇到操作字符串拼接还是老老实实new StringBuilder吧
突然想到循环,如果再循环内的话这个操作应该就会出现问题!!!
1 | public class Test { |

百度需谨慎啊啊!!


