区别就是:线程安全,StringBuffer 是线程安全的,StringBuilder 不是线程安全的。
他俩的实现机制一样,唯一的区别就是 StringBuilder 给修改数据的方法都加上了 synchronized
关键字。
String
是 Immutable 的,原生保证了线程安全,StringBuffer 和 StringBuilder 底层都是利用可以修改的数组,这个数组应该创建多大的呢?如果太小不够用,如果太大浪费空间。目前的实现是:构建时在初始字符串长度的基础上+16,如果没有初始字符串,那么初始值就是16。当长度不够时,进行扩容,抛弃原有数组,创建新的数组,进行 arraycopy。如果确定拼接会发生很多次,而且大概是可预计的,那么就可以指定合适的大小,避免多次扩容的开销。
在写代码时,如果经常使用 .append()
方法来拼接字符串,也是挺麻烦的,例如:
String strByBuilder = new StringBuilder().append("aa").append("bb").append("cc").append ("dd").toString();
其实Java是比较智能的,JDK8中可以直接写:
String strByConcat = "aa" + "bb" + "cc" + "dd";
编译器会自动转换为 StringBuilder
操作。
网友评论