String

String += 操作

String += 操作

这段代码输出的结果是: “123456”, 看着好像是string被改变了,但实际上这是一种假象。JVM对上述代码是这样处理的:

  1. 执行第一行代码:新建一个String对象“123”(该对象保存在字符串常量池中),将“123”对象的实例引用赋值给string(保存在栈中)。
  2. 执行第二行代码:再新建一个String对象string,用来执行string + "456"操作,也就是说,string这个对象是没有发生改变的(String是final的不可变)。

每当用String操作字符串时,实际上是在不断的创建新的对象,而原来的对象就会变为垃圾被GC回收掉,这样的效率极低。

String 常量+常量

String 常量+常量

你会发现生成String对象的速度简直太快了,而这个时候StringBuilder速度上根本一点都不占优势。其实这是JVM的一个把戏,实际上:String string = "123" + "456";其实就是:String string = “123456”。

StringBuilder

StringBuilder线程不安全,但效率最高。

StringBuffer

StringBuffer线程安全,是在StringBuilder实现的方法上加了synchronized关键字。适合多线程下的字符串操作。

总结

类名 String StringBuilder StringBuffer
线程安全 安全 不安全 安全
字符串类型 常量 常量 常量
执行效率 最低 最高 略高
适用场景 常量拼接 单线程拼接 多线程拼接
收藏