都是对象,引用类型。
String:字符串常量,存在于常量池,字符串长度不可变。Java 中 String 是 immutable(不可变)的。
本质在于String的实现是一个Char数组,并且使用final修饰符。
因此对String对象的每次操作都需要重新申请内存,操作次数过多会导致无效内存占用增多,进而导致GC工作,降低效率。
StringBuffer:字符串变量(Synchronized,即线程安全)。如果要频繁对字符串内容进行修改,出于效率考虑最好使用 StringBuffer,如果想转成 String 类型,可以调用 StringBuffer 的 toString() 方法。
线程安全,即多线程状态下是安全的。浅层次,线程安全的本质是锁。
常用于全局变量,更改对象时操作原对象,内存消耗小。常用的方法有append和insert。
StringBuilder:字符串变量(非线程安全)。在内部,StringBuilder 对象被当作是一个包含字符序列的变长数组。默认长度为16。JDK5.0新增的。
使用策略
1.除了常量,不用String。
2.StringBuilder非线程安全,因此性能优于StringBuffer,但在多线程情况下,需要加锁。单线程情况下,使用StringBuilder,多线程时,均可。
3.StringBuffer的线程安全不是一个好特性,耗费性能却不能保证多线程安全。
4.在构造StringBuffer和StringBuilder时,最好指定容量,默认是16,可很好提升性能。
网友评论