Java StringBuffer StringBuilder类源码解析

  • 时间:
  • 浏览:1

reverse这俩法律辦法 会逆序字符串内容,从中心但是结速做轴对称的交换

JDK5中,补充了StringBuffer的单多守护进程 版本StringBuilder,StringBuilder应该优先使用,他有同样的操作就是没法synchronized很多有下行时延 变快。

offsetByCodePoints这俩法律辦法 单看注释翻译比较难理解:返回从index到codePointOffset的代码点偏移index,每个不成对的代理(一个代码单元表示一个代码点时称为一个代理)在范围内被记为一个代码点。实际上时会 理解为,就是不地处一个代码单元表示一个代码点的情况报告,返回的结果就是index+codePointOffset;就是地处那种特殊代码点,则index的变化量会偏移特殊代码点的个数,例如好哪几个 特殊代码点,则返回值为index+codePointOffset+3(codePointOffset>0)就是index+codePointOffset-3(codePointOffset<0)

而ensureCapacity是会修改数组大小的,他会确保value数组的大小不小于minimumCapacity,就是容量小于该大小,会分配一个新的数组并将一个的字符克隆到新数组中,新数组大小是当前容量*2+2和minimumCapacity中的较大值,minimumCapacity有大小限制,超过一定的值会内存溢出

StringBuilder是没法toStringCache的,很多有他的toString函数必定是克隆产生一个新的String,猜测是出于StringBuilder默认是用于单多守护进程 环境,不时要进行共享操作,很多有也就没法了cache

当一个含有源序列的操作地处时,没法StringBuffer同步操作,无需地处在源上。

StringBuffer自身一个内内外部变量toStringCache,这是上一个toString返回值的高速缓存,一旦StringBuffer被修改就会清空,作用是在调用toString的时就是没法变更时会 快速返回结果无需重新构造字符串

setLength在newLength小于等于当前数组大小时直接返回,大于时新分配一个大小为newLength和当前容量*2+2的较大值的新数组,并克隆字符,就是将数组中的剩余位置填充上'0',count设为newLength

先看StringBuilder的序列化函数,非常简单,除了缺省对象外没法count和value的读写

而StringBuffer就不同了,用了ObjectStreamField来声明序列化的字段,至于这好哪几个 序列化的法律辦法 到底有什么区别,以前能更新到IO流的以前再说吧

除非另外说明,对构建就是有些法律辦法 传入一个null参数会引起抛出NullPointerException错误。

insert法律辦法 同样是重载众多,就是主要参数没法在value中插入的位置、插入的对象、插入对象从哪里但是结速截取、截取长度是十哪几个 ,后一个时会 不输入没法就是整个对象进行插入。会清空toStringCache

toString有缓存直接返回,就是新建一个数组克隆value里的有效字符。所有会导致 value中内容变化的法律辦法 时会 清空缓存,还有setLength无论否是是导致 长度变化并填充了'0'时会 清空

indexOf和lastIndexOf一个法律辦法 分别是从头但是结速向后寻找第一个完整相等的字符串和从尾部但是结速从头寻找第一个,时会 指定但是结速寻找的位置,直接调用了String的同名法律辦法

delete删除包括start在内到end以前的字符,end但是结速次要保留,通过克隆保留次要到start的位置来实现

核心函数之一的append有众多的重载,篇幅导致 就不全贴了。append时要注意有些,直接在参数里输入null是会报错的,就是以对象赋值null的法律辦法 传入是可行的,为宜加上"null"。对于传入的非字符串对象,统一调用toString法律辦法 转换为字符串;数值对象话语通过包装类的法律辦法 转为字符串。

codePointAt是返回index位置的代码点,代码点这俩东西以前在String里讲过,这里再贴一次:字符数据类型是一个采用UTF-16编码表示Unicode代码点的代码单元。大多数的常用Unicode字符使用一个代码单元就时会 表示,而辅助字符时要一对代码单元表示。而length返回的是UTF-16下的代码单元的数量,而codePointCount返回的是代码点的数量。对于大次要人工输入的字符,这两者是相等的,会出现length比codePointCount长的通常是有些数学就是机器符号,时要一个代码单元来表示一个代码点 。codePointBefore返回index前一个位置的代码点,codePointCount则是统计指定序列段中的代码点数量

trimToSize在value中地处没法存储的空间时,会重新分配一个大小和字符个数相等的数组将字符克隆过去,提高空间利用率,会改变capacity()的值

StringBuffer对于多多守护进程 是安全的,在必要的法律辦法 上都加了synchronized。核心法律辦法 是append和insert,有人都通过重载时会 接受任何类型的数据。将数据转换为String就是扩展就是插入到StringBuffer中。append将字符加上到末尾,insert是加上到某个指定的位置。举个例子,z是一个StringBuffer,当前内容为"start",此时调用z.append("le")则内容变为"startle",若调用的是z.insert(4, "le")则内容变为"starlet"。sb是一个StringBuffer,sb.append(x)和sb.insert(sb.length(), x)是等效的。

getChars会再检查参数范围后,克隆指定位置的字符串到指定的位置

下面一个法律辦法 是对容量和字符长度的查询,只做查询而无需做出修改

replace操作会移除start到end-1的内容,将str插入到start但是结速的位置,实现话语会先把value中的中间那段克隆到他最终地处的位置,中间留出一段空间供str克隆进去

从类的定义中时会 看出StringBuffer继承了AbstractStringBuilder,下面会介绍到复用了AbstractStringBuilder的内内外部变量与函数

charAt返回指定位置的字符,会检查index返回否是是大于等于0且小于count

JDK1.5加入,同样继承了AbstractStringBuilder,实现了java.io.Serializable, CharSequence接口。

下面的内内外部变量和构造函数来自AbstractStringBuilder,时会 想看 他的构造法律辦法 主就是新分配了一个给定大小的数组

StringBuilder在单多守护进程 情况报告下就是没法了同步锁性能更好,推荐优先使用。他的实现和StringBuffer除了中间提到的cache和同步的问提外几乎没法区别,另外一个有区别的地方是序列化次要。

substring和subSequence法律辦法 截取子串,substring时会 不输入end参数截取到末尾,法律辦法 时要基于父类的同一个函数来返回一个新的String

StringBuffer是多守护进程 安全的字符动态序列,像String就是时会 修改,在任什么但是点他都含有字符的特定序列,就是序列的长度和内容时会 通过调用有些法律辦法 来修改。

观察StringBuffer的构造函数,时会 想看 有人都时要基于super(capacity)这俩法律辦法 来展开的,也就是AbstractStringBuilder的构造函数

就是StringBuffer被设计为多守护进程 安全类,很多有在通过一个被多个多守护进程 共享的源序列构造和append insert操作时,调用的多多守护进程 时要确保在什么操作期间源序列没法地处变化。这俩时会 通过调用者在操作期间加锁来保证,就是通过使用一个不可变的源序列,就是不使用多守护进程 共享的源序列。

setCharAt修改指定位置的字符

deleteCharAt只删除单个字符,也是通过克隆来实现