①可变性
String类不可变,它每次申请固定长度的char字符数组final char value[],并且不可修改,平时所使用的+号字符串拼接实际上是开辟了多个内存空间,最后结果字符串的堆内存可用,其余的空间全部成为垃圾。
StringBuffer和StringBuilder都是可变型字符串类,它们都继承自AbstractStringBuilder类,其中的字符数组定义是可变的char[] value,在其中每次字符串拼接如果容量充足就在当前堆内存改变,如果不足才开辟新的空间,其中每次扩容是原来容量的2倍+2,源码中是这样实现的:(value.length << 1) + 2,最大容量是Integer.MAX_VALUE - 8,为什么减8呢?因为对象头需要占用一定空间,实际占用大小因虚拟机位数而定。
②多线程安全
String和StringBuffer是多线程安全的,String的字符数组是final的,所以它不存在修改也就天然线程安全,而StringBuffer则是通过同步锁实现线程安全的,它的所有方法都是使用的synchronized修饰保证其线程安全性。而StringBuilder则是非线程安全的。
③适用条件
当字符串拼接很少时适合String类。当字符串拼接很频繁时,如果仅在单线程操作变量,适合StringBuilder;如果在多线程情况下,使用StringBuffer能更好保证其安全性。在单线程情况下,StringBuilder相比于StringBuffer有15%左右的性能提升。