String、StringBuffer、StringBuilder全面解读

String、StringBuffer、StringBuilder

String和另外两个的区别

String是被final修饰的,他的大小、长度是不可变的,就算调用 String 的 concat 方法,那也是把字符串拼接起来并重新创建一个对象,把拼接后的 String 的值赋给新创建的对象,String发生长度变化相对于StringBuffer和StringBuilder是非常消耗内存的,也就是说StringBuffer和StringBuilder更适合用于拼接字符串的场景。

StringBuffer和StringBuilder的区别

最基本的区别 StringBuffer线程安全 StringBuilder线程不安全
StringBuffer速度慢 StringBuilder速度快
是什么原因导致上面两种结果呢 ?
StringBuffer在拼接字符串过程中是对自己本身进行操作,只有自身一个对象
StringBuilder在拼接字符串过程中会创建多和对象进行操作,这也是他线程不安全的一个原因

他们的适用场景

stringbuffer 基本没有适用场景,你应该在所有的情况下选择使用 stringbuiler,除非你真的遇到了一个需要线程安全的场景,关于线程安全,即使你真的遇到了这样的场景,很不幸的是,恐怕你仍然有 99.99…99% 的情况下没有必要选择 stringbuffer,因为 stringbuffer 的线程安全,仅仅是保证 jvm 不抛出异常顺利的往下执行而已,它可不保证逻辑正确和调用顺序正确。大多数时候,我们需要的不仅仅是线程安全,而是锁。

题外话 为什么有StringBuilder这么好为什么会有StringBuffer?

因为……最早是只有StringBuffer,StringBuilder实在jdk1.5之后出现的,在前十年间StringBuffer为Java运行速度慢贡献了想当大的力量,如今实际操作字符串过程中也不常用到StringBuilder,因为在String字符串拼接时,Java编译器会隐式的将String替换为StringBuilder进行操作。但是在循环情况下,编译器无法做到足够只能的替换,会有不必要的性能损耗,因此循环拼接字符串的时候,还是老老实实用StringBuilder吧。

你可能感兴趣的:(Java)