String与StringBuffer、StringBuilder的区别
2016-07-01 16:39
561 查看
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修饰了,如下:
而所以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倍大小空间,如果
此时容量还不够,就直接扩充到需要的大小。
参考:http://blog.csdn.net/xieyuooo/article/details/6859160
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
相关文章推荐
- AlertDialog.Builder--转载
- 1007. Maximum Subsequence Sum (25)
- 为UIImage添加滤镜效果
- java.lang.IllegalArgumentException: Illegal character in query at index xxx:
- UISearchBar背景色及边框修改
- UIFont的详细用法
- Codeforces Round #360 (Div. 2) E The Values You Can Make(DP)
- request.getRemoteAddr()获取的值为0:0:0:0:0:0:0:1
- 下拉UITableview实现图片放大效果
- php include,require,include_once,require_once 的区别
- SystemUI下的RecentActivity
- I.MX6 ifconfig: SIOCSIFHWADDR: Cannot assign requested address
- easyui模板
- [IOS 开发] UILabel文字描边
- ThreadPool.QueueUserWorkItem性能测试与提高
- easyui 选中指定行
- uuid/uuid.h: 没有这个文件或目录
- H-ui小技巧
- 用UIButton做出cell的点击效果《一》
- iOS UI篇12- 本地通知