String和StringBuilder、StringBuffer的区别
来源:互联网 发布:淘宝外贸原单江苏南通 编辑:程序博客网 时间:2024/06/05 17:45
String和StringBuilder、StringBuffer的区别
(原文地址:http://blog.csdn.net/dfdsggdgg/article/details/51347748)
一、String
看下JDK1.7 String成员变量的源码
可以看到String定义的成员变量value和hash,其中value是个字节数组,而且是final修饰,这个才是String不可变的关键点;
JDK1.7 String的部分注解
上面解释了:
java为String提供了特殊的支持,例如:String a="a"; String b="b" ;当执行String c=a+b操作时,实际上是创建一个StringBuilder对象或者StringBuffer对象,再通过apend()进行拼接,最后调用toStirng()生成一个新的对象给c。
String提供修改内容的方法最终都是调用new String()。看下 String的部分注释
这里定义了一个String str = "abc";相当于char data[] = {'a', 'b', 'c'};String str = new String(data);
再来看一个substring()方法的源码
看完这些,你可以清楚的知道定义一个变量str="hello world",则是在内存中分配一个对象new String("hello world"),当你修改str="hello nimei",变量重新指向内存中新分配的new String("hello nimei");原来内存中的new String("hello world")还在那里,没有改变,等待垃圾回收。、
难道真的没有办法修改new String("hello world")对象中的值而不重新在内存中重新new一次吗?让我们来看看一个例子。
原来通过反射可以修改String对象中的内容,反射太强大了。
二、StringBuffer和StringBuilder
StringBuffer的部分源码
StringBuilder的部分源码
StringBuffer和StringBuilder的这部分源码基本一样,构造函数初始化大小都为16,都是继承了AbstractStringBuilder。
看看AbstractStringBuilder定义成员变量的源码
AbstractStringBuilder中定义的变量value,是个字节数组,和String的成员变量value相比,String的value是final修饰的,所以StringBuffer和StringBuilde的内容可以变。
在对比下StingBuffer和StringBuilder的实现其他细节,以append()方法为例。
两者最大的区别是:StingBuffer所有的实现的方法都是sychronized修饰的,StringBuilder则不是。三、String、StringBuffer和StringBuilder的总结
1、概念总结
2).StringBuffer和StringBuilder相比,StringBuffer是synchronized的,是线程安全的,而StringBuilder是非线程安全的,单线程情况下性能更好一点;使用StringBuffer和StringBuilder时,可以适当考虑下初始化大小,较少扩容的次数,提高代码的高效性。
2、使用场景总结
1).如果要操作少量的数据用 = String
2).单线程操作字符串缓冲区 下操作大量数据 = StringBuilder
3).多线程操作字符串缓冲区 下操作大量数据 = StringBuffer
- StringBuffer和StringBuilder和String的区别
- String和StringBuffer和StringBuilder的区别
- StringBuffer和StringBuilder和String的区别
- string和stringBuilder和stringBuffer的区别
- String和StringBuffer和StringBuilder的区别
- String Stringbuffer和StringBuilder的区别
- String Stringbuffer和StringBuilder的区别
- String StringBuffer和StringBuilder的区别?
- String、StringBuffer和StringBuilder的区别
- String 和StringBuffer,StringBuilder的区别
- String,StringBuffer 和StringBuilder的区别
- String、StringBuffer和StringBuilder的区别
- String Stringbuffer和StringBuilder的区别
- String、StringBuffer和StringBuilder的区别
- String 和StringBuffer,StringBuilder的区别
- String、StringBuilder和StringBuffer的区别
- String、StringBuilder和StringBuffer的区别
- String、StringBuilder和StringBuffer的区别
- Saving James Bond
- [数位DP 多重背包计数] BZOJ5003. 与链
- Linux的进程环境
- Android程序跳过登录界面直接进入主界面(自动登录)
- 七里香
- String和StringBuilder、StringBuffer的区别
- java.lang.NoClassDefFoundError错误
- 剑指offer--判断两个链表的第一个交点
- [学习笔记]Python_变量
- [多活] 分布式、多活数据中心如何实现DNS域名解析和负载均衡?
- 一个特殊的中断:SVCall
- 安卓UI 自定义View SwitchButton
- AttributeError: 'NoneType' object has no attribute 'startswith'
- QT 使用QSetting读取配置文件中的中文乱码解决方案