String与StringBuffer、StringBuilder的区别

来源:互联网 发布:魔兽世界数据库wlk 编辑:程序博客网 时间:2024/05/17 22:38

1、String是不可变的,StringBuffer和StringBuilder是可变的

String和StringBuffer、StringBuilder内部都是使用char[]数组来存储,但它们之间内部的定义不同

查看源码可知:

String内部声明的char[]数组是 private final char value[];

StringBuffer和StringBuiler都是继承自AbstractStringBuilder,它们内部声明的char[]数组不是private final类型,为:char[] value;


2、StringBuffer是线程安全的,而StringBuiler是非线程安全的

StringBuilder在JDK1.5才开始出现,之前是没有的

StringBuffer是线程安全的是由于StringBuffer内部定义的方法前面都使用Synchronized修饰了,如下:

public synchronized int length() {        return count;    }

而所以StringBuilder的方法没有使用synchronize修饰,所以在多线程的情况下,StringBuffer能保证线程安全,而StringBuilder不能保证


3、String、StringBuffer和StringBuilder之间速度不同,StringBuilder优于StringBuffer优于String

由于String是不能改变的,所以每次对String进行修改,就会重新new一个对象,而StringBuilder和StringBuffer都可以在源对象上进行修改

当需要大量的修改时,String每次会new出很多对象出来,而且很多对象new出来之后,可能就不再使用变成内存垃圾,此时会导致频繁的

垃圾回收,最终造成运行速度变慢。


4、String声明后容量大小不能改变,StringBuffer和StringBuilder可以动态扩容

String由于内部数组声明的是final,所以大小不能再改变

而StringBuilder和StringBuffer初试化容量是16,当使用过程中容量不够后,会自动进行扩容,每次都是新申请一个原空间2倍大小空间,如果

此时容量还不够,就直接扩充到需要的大小。

  public StringBuilder() {        super(16);    }

参考:http://blog.csdn.net/xieyuooo/article/details/6859160

0 0
原创粉丝点击