Java当中的StringBuffer 和 StringBuilder

Java当中的StringBuffer 和 StringBuilder

由于String的不可变特性,使得如果频繁地修改字符串尤其是拼接字符串时就会产生很不理想的效果,它的性能会很低,因此才有了StringBuffer类和 StringBuilder类。
由于这两个类差异主要在于线程安全上的,其他方面几个没有差异,所以我们主要以StringBuilder为例来说明这两个类的特点,主要方法以及区别。

StringBuffer / StringBuilder

  1. 所属的包:java.lang包
  2. 继承AbstractStringBuilder(Java8的官方文档上没有写,不知为何),间接继承 Object
  3. 实现了Serializable,CharSequence,Appendable这三个接口。
  4. 特性:可变字符串
    它的底层是没有final修饰的char[]数组,可以进行动态扩容。

对象的构建:

无参数构造方法 构建一个默认长度16个空间的对象

StringBuilder builder = new StringBuilder();

利用给定的参数 构建一个自定义长度空间的对象

StringBuilder builder = new StringBuilder(20);

利用带String参数的构造方法 默认数组长度字符串长度+16个

StringBuilder builder = new StringBuilder("abc");

常用的方法:

  1. append():在字符串的末尾追加字符串,可以实现高性能得字符串拼接操作。
  2. ensureCapacity(int minimumCapacity):确保底层数组容量够用
  3. capacity():返回字符串底层char[]数组的容量
  4. length():返回字符串有效元素个数(长度)
  5. setLength():设置字符串的有效元素个数
  6. char = charAt(int index):返回给定index位置的char元素
  7. int = codePointAt(int index):返回给定index位置的char元素的code码
  8. String = substring(int start [,int end]):用来截取字符串。注意它的返回值是String,需要接受返回值。
  9. StringBuilder = delete(int start [,int end]):将start到end之间的字符串删掉 不用接受返回值就看到效果(StringBuilder类中独有的方法String类没有)。
  10. StringBuilder = deleteCharAt(int index):将给定index位置的某一个字符删除掉
  11. int = indexOf(String str [,int fromIndex]):找寻给定的元素在字符串中第一次出现的索引位置,如果有fromIndex参数,就从fromIndex索引位置开始寻找,若字符串不存在则返回-1
  12. int = lastIndexOf(String str [,int fromIndex]):找寻给定的元素在字符串中最后一次出现的索引位置,其他同上
  13. insert(int index,value):将给定的value插入在index位置之上
  14. replace(int start,int end,String str):将start和end之间的部分替换成str,注意它和String类中的replace()方法是不同的。
  15. setCharAt(int index,char value):将index位置的字符改成给定的value
  16. toString():将StringBuilder对象 构建成一个string对象并返回
  17. trimToSize():将底层数组中无用的容量去掉,变成length长度的数组
  18. reverse():将字符串中的元素反转

总结

StringBuilder类不一定需要,它是为了避免String频繁拼接修改字符串信息的时候才用的。
我们现在对比一下String类的concat()方法和StringBuiler类的append()方法拼接字符串的性能差异:

String str = "a";
long time1 = System.currentTimeMillis();
for (int i = 1;i<=200000;i++){
    str = str.concat("a");
}
long time2 = System.currentTimeMillis();
System.out.println(time2 - time1);//4522毫秒
StringBuilder builer = new StringBuilder("a");
long time1 = System.currentTimeMillis();
for (int i = 1;i<=200000;i++){
    builer = builer.append("a");
}
long time2 = System.currentTimeMillis();
System.out.println(time2 - time1);//9毫秒

可以看出,差异是巨大的。

常用方法归纳

与String类不同的独有方法

append() insert() delete() deleteCharAt() reverse()

与String类相同的方法

length() charAt() codePointAt() indexOf() lastIndexOf() subString()
replace()名字相同 用法不一致

不是很常用的方法

ensureCapacity() capacity() setLength() trimToSize() setCharAt()

String和StringBuilder区别

String:
可变字符串,不可变体现在长度及内容
在JDK1.0版本中出现
实现的接口之一:Comparable
有一些方法StringBuilder没有,比如concat()

StringBuilder:
可变字符串,没有final修饰得char[]数组,可以动态扩容
在JDK1.5版本中出现
有一些方法String没有,比如 append() insert() delete()

StringBuffer和StringBuilder区别

StringBuffer是在Java1.0版本中就有的,而StringBuilder是在Java1.5版中才出现的。
StringBuffer是线程同步的,安全性比较高。
而StringBuilder是线程异步的,执行效率比较高。

通常情况下
早期版本 线程同步    安全性比较高 执行效率相对较低
后期版本 线程非同步 安全性比较低 执行效率相对较高

发布了68 篇原创文章 · 获赞 57 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_43598138/article/details/104760109