String StringBuilder StringBuffer的理解

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 StringBuffer的理解)