纵骑横飞 章仕烜
 
昨天比较忙 今天把StringBuffer StringBulider的源码分析 献上
 
在讲 StringBuffer StringBuilder 之前 ,我们先看一下 它们共同的老祖宗
AbstractStringBuilder
这是 StringBuilder StringBuffer 的根基
再看看 这两个实现类 里边有什么
 
很显然,这两个东西什么都没写吧
 
我们看看 另一个门派的 String
 
看出 为什么 我们说String 对象是不可变的 StringBuilder StringBuffer 可变的原因了吗?
 
就是 上面 的 三个final 对吧
 
好 那么我们都知道了 String 是不可变的 ,也就是说 就像 一次性纸杯,你如果想要50ml
那就拿50ml的杯子 想100ml 就拿 100ml的杯子 不需要换杯子
然后就是 一个问题: StringBuffer StringBuilder 底层是一堆数组 它们是如何扩容的?
 
 
所谓 容量 就是 底层数组的实际长度 ,比如说 ArrayList 底层当然是个array
这个集合 里边加的东西 不是不限个嘛 怎么做到这种效果 ,用的就是 CAPACITY
 
大家需要知道 扩容的3个问题:
 
1. 默认 容量是多少?
2. 如何扩容 ?
3. 和 length 是什么区别 ?
 
 
再有一个问题 StringBuffer 为什么是线程安全的?
 
 
这是简略版 的 StringBuffer 大家可以看一下
public final class StringBuffer extends AbstractStringBuilder implements java.io.Serializable, CharSequence
{
static final long serialVersionUID = 3388685877147921107L; public StringBuffer() {
super(16);
} public StringBuffer(int capacity) {
super(capacity);
} public StringBuffer(String str) {
super(str.length() + 16);
append(str);
} /**
*这边也是一样的
*/
public StringBuffer(CharSequence seq) {
this(seq.length() + 16);
append(seq);
} public synchronized int length() {
return count;
} public synchronized int capacity() {
return value.length;
}
/**
* jdk 直接对外提供的 扩容 方法
*/
public synchronized void ensureCapacity(int minimumCapacity) {
if (minimumCapacity > value.length) {
expandCapacity(minimumCapacity);
}
}
/**
* trim to actual size 也就是 array.length ---> count
*/
public synchronized void trimToSize() {
super.trimToSize();
}

public synchronized void setLength(int newLength) {
super.setLength(newLength);
}
public synchronized char charAt(int index) {
if ((index < 0) || (index >= count))
throw new StringIndexOutOfBoundsException(index);
return value[index];
} public synchronized int codePointAt(int index) {
return super.codePointAt(index);
} public synchronized int codePointBefore(int index) {
return super.codePointBefore(index);
}
public synchronized int codePointCount(int beginIndex, int endIndex) {
return super.codePointCount(beginIndex, endIndex);
}
public synchronized int offsetByCodePoints(int index, int codePointOffset) {
return super.offsetByCodePoints(index, codePointOffset);
} public synchronized void getChars(int srcBegin, int srcEnd, char dst[],
int dstBegin)
{
super.getChars(srcBegin, srcEnd, dst, dstBegin);
} public synchronized void setCharAt(int index, char ch) {
if ((index < 0) || (index >= count))
throw new StringIndexOutOfBoundsException(index);
value[index] = ch;
} /**
* append
*/
public synchronized StringBuffer append(Object obj) {
super.append(String.valueOf(obj));
return this;
} public synchronized StringBuffer appendCodePoint(int codePoint) {
super.appendCodePoint(codePoint);
return this;
} public synchronized StringBuffer delete(int start, int end) {
super.delete(start, end);
return this;
} public synchronized StringBuffer replace(int start, int end, String str) {
super.replace(start, end, str);
return this;
} public synchronized CharSequence subSequence(int start, int end) {
return super.substring(start, end);
} public synchronized String substring(int start, int end) {
return super.substring(start, end);
} public synchronized StringBuffer insert(int index, char str[], int offset,
int len)
{
super.insert(index, str, offset, len);
return this;
} public synchronized StringBuffer insert(int offset, String str) {
super.insert(offset, str);
return this;
} public synchronized StringBuffer insert(int offset, char str[]) {
super.insert(offset, str);
return this;
} public synchronized StringBuffer insert(int dstOffset, CharSequence s,
int start, int end)
{
super.insert(dstOffset, s, start, end);
return this;
}
/**
* 默认检索起始位置 为 0
*/
public int indexOf(String str) {
return indexOf(str, 0);
} public synchronized int indexOf(String str, int fromIndex) {
return String.indexOf(value, 0, count,
str.toCharArray(), 0, str.length(), fromIndex);
} public int lastIndexOf(String str) {
// Note, synchronization achieved via other invocations
return lastIndexOf(str, count);
} public synchronized int lastIndexOf(String str, int fromIndex) {
return String.lastIndexOf(value, 0, count,
str.toCharArray(), 0, str.length(), fromIndex);
}
/**
* reverse 和 replace 这些和 顺序 有关的方法
* 在 Collections 里边也有 只不过 只支持 List 实现类(与顺序相关)
*/
public synchronized StringBuffer reverse() {
super.reverse();
return this;
} public synchronized String toString() {
return new String(value, 0, count);
} private static final java.io.ObjectStreamField[] serialPersistentFields =
{
new java.io.ObjectStreamField("value", char[].class),
new java.io.ObjectStreamField("count", Integer.TYPE),
new java.io.ObjectStreamField("shared", Boolean.TYPE),
}; private synchronized void writeObject(java.io.ObjectOutputStream s)
throws java.io.IOException {
java.io.ObjectOutputStream.PutField fields = s.putFields();
fields.put("value", value);
fields.put("count", count);
fields.put("shared", false);
s.writeFields();
} private void readObject(java.io.ObjectInputStream s)
throws java.io.IOException, ClassNotFoundException {
java.io.ObjectInputStream.GetField fields = s.readFields();
value = (char[])fields.get("value", null);
count = (int)fields.get("count", 0);
}
}
StringBuilder 相对于 StringBuffer 就是没有 加锁
 
 
 
 
 
 
 
 
 

[源码]String StringBuffer StringBudlider(2)StringBuffer StringBuilder源码分析的更多相关文章

  1. String、StringBuffer、StringBuilder源码分析

    利用反编译具体看看"+"的过程 1 public class Test 2 { 3 public static void main(String[] args) 4 { 5 int ...

  2. String、StringBuffer、StringBuilder源码解读

    序 好长时间没有认真写博客了,过去的一年挺忙的.负责过数据库.线上运维环境.写代码.Code review等等东西挺多. 学习了不少多方面的东西,不过还是需要回归实际.加强内功,方能扛鼎. 去年学习M ...

  3. String,StringBuffer和StringBuilder源码解析[基于JDK6]

    最近指导几位新人,学习了一下String,StringBuffer和StringBuilder类,从反馈的结果来看,总体感觉学习的深度不够,没有读出东西.其实,JDK的源码是越读越有味的.下面总结一下 ...

  4. String,StringBuffer,StringBuilder源码分析

    1.类结构 String Diagrams StringBuffer Diagrams StringBuilder Diagrams 通过以上Diagrams可以看出,String,StringBuf ...

  5. String、StringBuffer和StringBuilder源码解析

    1.String 1.1类的定义 public final class String implements java.io.Serializable, Comparable<String> ...

  6. Stringbuffer与Stringbuilder源码学习和对比

    >>String/StringBuffer/StringBuilder的异同 (1)相同点观察源码会发现,三个类都是被final修饰的,是不可被继承的.(2)不同点String的对象是不可 ...

  7. 字符串(String、StringBuffer、StringBuilder)进阶分析

    转载自https://segmentfault.com/a/1190000002683782 我们先要记住三者的特征: String 字符串常量 StringBuffer 字符串变量(线程安全) St ...

  8. 关于String.concat()方法和StringBuffer.append()方法的学习:方法是如何追加字符到源字符串的

    问题分析: 首先,看看两段代码的运行结果,两段代码分别是: 第一段代码,关于String.concat()方法的测试: public static void main(String[] args) { ...

  9. Java学习笔记20(String类应用、StringBuffer类、StringBuilder类)

    1.获取指定字符串中大小写和数字的个数: package demo; public class StringTest { public static void main(String[] args) ...

  10. Java中的字符串操作(比较String,StringBuiler和StringBuffer)

    一.前言 刚开始学习Java时,作为只会C语言的小白,就为其中的字符串操作而感到震撼.相比之下,C语言在字节数组中保存一个结尾的\0去表示字符串,想实现字符串拼接,还需要调用strcpy库函数或者自己 ...

随机推荐

  1. Neo4j 查询已经创建的索引与约束

    在Neo4j 2.0之后为cypher语法增加了一些类似于DDL的语法,能够自己创建索引,约束等等. 有如下的方法可以查询到当前图数据库的索引数量: neo4j-shell 使用:index –ind ...

  2. CSS中的text-overflow:clip|ellipsis的使用

    如果想让某个容器(div或者li或者...块级元素)显示一行文字,当文字内容过多时,不换行,而是出现...,可以使用text-overflow:clip|ellipsis 基本语法:text-over ...

  3. 深入理解kmp中的next数组

    next数组 1. 如果对于值k,已有p0 p1, ..., pk-1 = pj-k pj-k+1, ..., pj-1,相当于next[j] = k. 此意味着什么呢?究其本质,next[j] = ...

  4. web安全之xss

    xss:跨站脚本攻击,攻击者,把一段恶意代码镶嵌到web页面,,用户浏览页面时,嵌入页面的恶意代码就会执行,从而到达攻击用户的目的. 重点在于脚本,javascript和actionscript    ...

  5. 初学HTML5、初入前端

    学习HTML5是一个漫长的过程,当中会遇到很多技术与心态上的变化.刚开始学习,我们不能发力过猛,需要一个相对稳定的状态去面对.多关注一些自己感兴趣的网站和技术知识,建立自己的信心与好奇心,为以后的学习 ...

  6. SolrCloud分布式集群部署步骤

    Solr及SolrCloud简介 Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口.用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成 ...

  7. 从Eclipse转移到IntelliJ IDEA一点心得

    http://www.ituring.com.cn/article/37792 本人使用IntelliJ IDEA其实并不太久,用了这段时间以后,觉得的确很是好用.刚刚从Eclipse转过来的很多人开 ...

  8. XMLHttpRequest

    XMLHttpRequest对象的方法 abort() 取消当前所发出的请求 getAllResponseHeaders() 取得所有的HTTP头信息 getResponseHeader() 取得一个 ...

  9. 与VS集成的若干种代码生成解决方案[博文汇总(共8篇)]

    http://www.cnblogs.com/artech/archive/2010/11/17/CodeGeneration.html [第1篇] 通过CodeDOM定义生成代码的结构 我 不知道大 ...

  10. Android单元测试实践

    为什么要写单元测试 首先要介绍为什么蘑菇街支付金融这边会采用单元测试的实践.说起来比较巧,刚开始的时候,只是我一个人会写单元测试.后来老板们知道了,觉得这是件 很有价值的事情,于是就叫我负责我们组的单 ...