java 数据结构(1) string stringbuffer stringbuild
String、StringBuilder、StringBuffer
二、使用场景
1.使用 String 类的场景:在字符串不经常变化的场景中可以使用 String
类,例如常量的声明、少量的变量运算。
2.使用 StringBuffer
类的场景:在频繁进行字符串运算(如拼接、替换、删除等),并且运行在多线程环境中,则可以考虑使用
StringBuffer,例如 XML 解析、HTTP 参数解析和封装。
3.使用 StringBuilder
类的场景:在频繁进行字符串运算(如拼接、替换、和删除等),并且运行在单线程的环境中,则可以考虑使用
StringBuilder,如 SQL 语句的拼装、JSON 封装等。
4、容量扩充策略:
一、基本概念
查看 API 会发现,String、StringBuffer、StringBuilder 都实现了
CharSequence
接口,内部都是用一个char数组实现,虽然它们都与字符串相关,但是其处理机制不同。
1.String:是不可改变的量,也就是创建后就不能在修改了。
2.StringBuffer:是一个可变字符串序列,它与 String
一样,在内存中保存的都是一个有序的字符串序列(char
类型的数组),不同点是 StringBuffer 对象的值都是可变的。
3.StringBuilder:与 StringBuffer
类基本相同,都是可变字符换字符串序列,不同点是 StringBuffer
是线程安全的,StringBuilder 是线程不安全的。
三、性能
1.由于 String 类的操作是产生新的 String 对象,而 StringBuilder 和
StringBuffer 只是一个字符数组的扩容而已,所以 String 类的操作要远慢于
StringBuffer 和 StringBuilder。简要的说, String 类型和 StringBuffer
类型的主要性能区别其实在于 String 是不可变的对象, 因此在每次对 String
类型进行改变的时候其实都等同于生成了一个新的 String
对象,然后将指针指向新的 String
对象。所以经常改变内容的字符串最好不要用 String
,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后,
JVM 的 GC 就会开始工作,那速度是一定会相当慢的。而如果是使用
StringBuffer 类则结果就不一样了,每次结果都会对 StringBuffer
对象本身进行操作,而不是生成新的对象,再改变对象引用。所以在一般情况下我们推荐使用
StringBuffer ,特别是字符串对象经常改变的情况下。
2.使用 StringBuffer、StringBuilder 的无参构造器产生的对象默认拥有** 16
个字符长度大小**的字符串缓冲区, 如果是调参数为 String
的构造器,默认的字符串缓冲区容量是 String 对象的长度 16 个长度的大小(留
16 个长度大小的空缓冲区)。详细信息可见 StringBuilder 源码。
合理的指定字符串缓冲区的容量可以大大的提高系统的性能(若按表格的数据来算,
性能约提升了 108%), 这是因为 StringBuilder
在缓冲区容量不足的时候会自动扩容,
而扩容就会涉及到数组的拷贝(StringBuilder 和 StringBuffer 底层都是使用
char 数组来实现的), 这个也可以在源码的 expandCapacity(int)
方法中看的出。这些额外的开销都是需要花费掉一定量的时间的。
1、String不可变字符序列,StringBuilder和StringBuffer可变字符序列。
参考
浅谈 Java 字符串(String, StringBuffer,
StringBuilder)
小瓜牛漫谈 —
String、StringBuffer、StringBuilder
StringBuffer和StringBuilder的区别
3、StringBuilder和StringBuffer默认容量16。
1、char占两个字节,Character是char的包装类型
高位代理区间:D800~DBFF(1024,在第0平面)
2、范围是\u0000~\uffff
1)选取原容量的2倍加2和指定容量比较的最大值,作为新容量
2)不得大于Integer.MAXVALUE,会出现OutOfMemoryError异常
2、StringBuilder和StringBuffer的API兼容,建议在单一线程下优先使用StringBuilder来提高性能。而StringBuffer是线程安全的。
3、缓存128位ASCII码
Character
5、第0平面0000~FFFF的CodePoint使用一个char表示,其他平面的CodePoint使用高位代理 低位代理两个char表示
低位代理区间:DC00~DFFF(1024,在第0平面)
4、valueOf(char->Character)当创建一个Character时建议调用此方法提高性能
本文由广东快乐10分预测发布于广东快乐10分预测,转载请注明出处:java 数据结构(1) string stringbuffer stringbuild
下一篇:没有了