标签:行操作 highlight https 技术分享 可变 blank buffer 功能 nal
StringBuffer和StringBuilder都继承自AbstractStringBuilder这个类,而AbstractStringBuilder和String都继承自Object这个类(Object是所有java类的超类)
我们查看这三个类的源码,String:字符串常量,字符串长度不可变。Java中String是immutable(不可变)的。源码中 private final char value[]; 因为value被final修饰,所以不可变
而StringBuffer 与 StringBuilder 中的方法和功能完全是等价的,只是StringBuffer 中的方法大都采用了 synchronized 关键字进行修饰,因此是线程安全的,而 StringBuilder 没有这个修饰,可以被认为是线程不安全的。
在执行速度上,String < StringBuffer < Stringbuilder 。
这是因为String类是不可变的,即字符串常量,所以每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象。这就会对程序运行产生很大的影响,因为当内存中的无引用对象多了以后,JVM的GC进程就会进行垃圾回收,这个过程会耗费很长一段时间,因此经常改变内容的字符串最好不要用 String类的对象。而如果是使用 StringBuffer 类则结果就不一样了,每次结果都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,再改变对象引用。所以在一般情况下我们推荐使用 StringBuffer ,特别是字符串对象经常改变的情况下。
但是在某些特殊情况下, String 对象的字符串拼接其实是被 JVM 解释成了 StringBuffer 对象的拼接,所以这些时候 String 对象的速度并不会比 StringBuffer 对象慢,而特别是以下的字符串对象生成中, String 运行速度是远要比 StringBuffer 快的:
但是如果要拼接的字符串来自于不同的String对象的话,那结果就不一样了:
这时候使用StringBuffer的运行速度更快
String、StringBuffer、StringBuilder区别
标签:行操作 highlight https 技术分享 可变 blank buffer 功能 nal
原文地址:https://www.cnblogs.com/wanghongsen/p/9118556.html