纵骑横飞 章仕烜
 
昨天比较忙 今天把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. mvn打包时添加version和profile

    <!-- 定义profile --> <profiles> <!-- 开发环境 --> <profile> <id>dev</id&g ...

  2. Autofac 同时支持MVC 与Webapi

    1.引用 using Autofac; using Autofac.Integration.Mvc; using Autofac.Integration.WebApi; 2.在Global中的Appl ...

  3. JUnit报错需导入两个jar包

    <dependency> <groupId>org.hamcrest</groupId> <artifactId>hamcrest-core</a ...

  4. cache manifest 格式

    下面说明书写 cache manifest 文件需要遵循的格式.1 首行必须是 CACHE MANIFEST.2 其后,每一行列出一个需要缓存的资源文件名.3 可根据需要列出在线访问的白名单.白名单中 ...

  5. 解决IAR无法跳转的问题

    在工程的C编译器选项里的预编译添加$TOOLKIT_DIR$\inc可以搞定.

  6. 命令模式(Command Pattern)

    命令模式的本质是对命令进行封装,将发出命令的责任和执行命令的责任分割开.命令模式是为了解决命令的请求者和命令的实现者之间的耦合关系. 将来自客户端的请求传入一个对象,从而使你可用不同的请求对客户进行参 ...

  7. oracle表分区详解(按天、按月、按年等)

    分区表的概念:  当表中的数据量不断增大,查询数据的速度就会变慢,应用程序的性能就会下降,这时就应该考虑对表进行分区.表进行分区后,逻辑上表仍然是一张完整的表,只是将表中的数据在物理上存放到多个表空间 ...

  8. formData上传图片

    ---------------------formData上传图片--------------------- <form id="imageform"> <img ...

  9. Windows 2012 中文乱码的解决办法

    背景:服务器安装2012 R2英文环境,软件为中文显示.已下载中文语言包安装到服务器上 现象:TXT文档的中文在服务器上打开显示为乱码,复制到本地电脑上可正常显示 解决办法:控制面板-语言-更改日期. ...

  10. 原生js事件委托

    var commontop = document.getElementById("commontop");commontop.onclick = function(ev){   v ...