美文网首页java基础
String StringBuilder StringBuffe

String StringBuilder StringBuffe

作者: 风一样的行者 | 来源:发表于2018-04-25 09:18 被阅读0次

    String的不可变性

    1.首先String 是一个final类,也即意味着String类不能被继承,并且它的成员方法都默认为final方法。
    2.无论是sub操、concat还是replace操作都不是在原有的字符串上进行的,而是重新生成了一个新的字符串对象。也就是说进行这些操作后,最原始的字符串并没有被改变。

    对String对象的任何改变都不影响到原对象,相关的任何change操作都会生成新的对象。

    3.这句 string += "hello"; 的过程相当于将原有的string变量指向的对象内容取出与"hello"作字符串相加操作再存进另一个新的String对象当中,再让string变量指向新生成的对象。

    string += "hello world" 这一句在java虚拟机中的执行过程是:先会new 出一个StringBuilder对象,然后调用StringBuilder的append方法,再调用StringBuilder的toString 成为一个String对象,最后将原来string的引用指向新的String对象

    所以 如果操作少量数据的话可以用String,但是如果要操作大量的数据,并且有数据的拼接,截取,或者替换操作,则此时建议使用 StringBuilder(单线程中) 或者 StringBuffer(多线程中)

    三者的区别

    1.在执行效率上:Stringbuilder->Stringbuffer->String

    这个很好理解,StringBuilder是在单线程中使用,没有线程同步之类的开销,自然性能最优,对String的每次操作都会生成一个StringBuilder对象,所以执行效率也没有StringBuffer高

    2.String是字符串常量,而StringBuilder与StringBuffer是字符串变量(即String是不可变对象,后面两个是可变对象)

    3.StringBuilder与StringBuffer

    StringBuilder:线程非安全的(适合在单线程中使用)

    StringBuffer:线程安全的(适合在多线程中使用)

    当我们在字符串缓冲区去被多个线程使用时,JVM不能保证StringBuilder的线程是安全的,虽然他的速度最快,但是可以保证StringBuffer是可以正确操作的。当然大多数情况是在单线程下进行的,所以大多数情况下是建议用StringBuilder而不用StringBuffer的,就是速度的原因。

    总结

    对于三者的总结:
    1)如果操作少量的数据用String
    2)单线程下操作大量的数据用StringBuilder
    3)多线程下操作大量的数据用StringBuffer

    StringBuffer 之所以是线程安全的,是因为在对字符串进行操作的所有方法中都有同步操作

        public synchronized StringBuffer append(StringBuffer sb) {
            super.append(sb);
            return this;
        }
    

    相关文章

      网友评论

        本文标题:String StringBuilder StringBuffe

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