美文网首页
String、StringBuffer、StringBuilde

String、StringBuffer、StringBuilde

作者: 小明今晚加班 | 来源:发表于2019-10-08 23:06 被阅读0次

String

String是不可变的类,即final 类,String底层使用final Char[] 来实现,不可变的字符数组。
当我们进行字符串拼接的时候,如下

String str = "a" + "b";

这个时候会在堆上创建三个String对象,分别是str1="a",str2="b",str="ab".因此如果有大量的这种字符串拼接等操作的话,会影响程序的运行速度。
String的定义如下:

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {...}

StringBuffer

因此我们引入了StringBuffer类,它的底层实现是可变的字符串数组,当我们执行append方法的时候,操作的对象是StringBuffer对象本身,而不会像String那样产生多个中间对象。但是有个问题,StringBuffer在执行某些方法的时候,比如append方法,会对方法体加锁(synchronized)保证线程安全。但是我们知道加锁和释放锁是需要耗费资源的,因此在进行大量的、业务不需要线程安全的情况下使用StringBuffer就显得效率低下,因此就有了后面的StringBuilder类。

StringBuilder

StringBuilder类的绝大部分功能和StringBuffer都一样,但是StringBuiler类是线程不安全的,因此,相比与StringBuffer类来说,StringBuilder类在执行字符串拼接等操作的时候速度更快。


字符串常量池(String constant pool)

看看我们的代码,你会发现String是真的频繁得使用到,Java为了避免在一个系统中产生大量的String对象,引入了字符串常量池。
创建一个字符串时,首先会检查池中是否有值相同的字符串对象,如果有就直接返回引用,不会创建字符串对象;如果没有则新建字符串对象,返回对象引用,并且将新创建的对象放入池中。但是,通过new方法创建的String对象是不检查字符串常量池的,而是直接在堆中创建新对象,也不会把对象放入池中。上述原则只适用于直接给String对象引用赋值的情况。

String str1 = new String("a"); //不检查字符串常量池的

String str2 = "bb"; //检查字符串常量池的


总的来说,从两个方面来对比String、StringBuffer、StringBuilder,

执行速度:StringBuilder > StringBuffer > String

应用场景:
String: 少量的字符串操作
StringBuffer: 需要线程安全的字符串操作
StringBuilder: 在单线程或者不需要保证线程安全的情况下进行大量字符串操作

相关文章

网友评论

      本文标题:String、StringBuffer、StringBuilde

      本文链接:https://www.haomeiwen.com/subject/efoipctx.html