[源码]String StringBuffer StringBudlider(2)StringBuffer StringBuilder源码分析

纵骑横飞 章仕烜

昨天比较忙 今天把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 就是没有 加锁

时间: 2024-10-23 16:01:44

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

String、StringBuffer和StringBuilder源码解析

1.String 1.1类的定义 public final class String implements java.io.Serializable, Comparable<String>, CharSequence String类在定义时候使用final关键字进行修饰,限制了这个类无法被继承,里面的方法也无法被重写. 同时它还实现了Serializable接口.Comparable接口,以及CharSequence接口三个接口: Serializable:序列化接口,如果允许对象被序列化需要

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

1.获取指定字符串中大小写和数字的个数: package demo; public class StringTest { public static void main(String[] args) { getCount("IamHandsome666"); } public static void getCount(String str) { int upper = 0; int lower = 0; int digit = 0; for (int i = 0; i < str

java.lang.StringBuilder源码分析

StringBuilder是一个可变序列的字符数组对象,它继承自AbstractStringBuilder抽象类.它不保证同步,设计出来的目的是当这个字符串缓存只有单线程使用的时候,取代StringBuffer的.建议使用它而不是StringBuffer,因为它的速度更快. StringBuilder有自己的容量(字符数组),当容量还没有被占满的时候,不必申请新的空间,当容量被占满后,它会自动地扩容. public final class StringBuilder extends Abstra

Java基础知识强化44:StringBuffer类之StringBuffer和String的相互转化

1. String和StringBuffer的相互转换 思想是:A-----B的转换,我们把A转换为B,其实是为了使用B的功能:B-----A的转换,我们可能的结果是A类型,所以还要转换回来 2. 案例演示: 1 package cn.itcast_07; 2 3 /* 4 * 为什么我们要讲解类之间的转换: 5 * A -- B的转换 6 * 我们把A转换为B,其实是为了使用B的功能. 7 * B -- A的转换 8 * 我们可能要的结果是A类型,所以还得转回来. 9 * 10 * Strin

【小白的java成长系列】——String类的深入分析(基于源码)

接着前面面向对象来说吧~今天来说说String类..其实String类也包含很多面向对象的知识的~ 首先来问一个问题:我们在开发过程中,如果要使用一个类的话,就要创建对象,这句话没什么问题吧~在实际开发的时候确实是这样的,只有创建了对象才能真正的去使用一个普通的类,我们一般创建对象,几乎所有的类创建对象都是要通过new关键字来创建的~ 问题就来了..为什么我们的String可以直接写成String str = "abc";这样子呢? 当然String类也可以通过new来创建对象的...

Java基础知识强化48:StringBuffer类之StringBuffer的三个面试题

1. 面试题:String,StringBuffer,StringBuilder的区别 ? 答:String是字符串内容不可变的,而StringBuffer和StringBuilder是字符串内容长度可变的: StringBuffer是同步的,数据安全,效率低. StringBuilder是不同步的,数据不安全,效率高. 2. 面试题:StringBuffer 和数组的区别? 答:二者都可以看出是一个容器,装其他的数据.但是呢,StringBuffer的数据最终是一个字符串数据,而数组可以放置任

关于String的equals问题和StringBuilder问题

今天弄了一下String和StringBuilder,遇到了一些问题. 老规矩上代码图片: 发现stringBuilder的equals方法有问题,看了一下源码,发现stringbuilder没有重写.equals方法,使用的依旧是默认的 object的equals方法 所以是不等于, 再看看这个string的equals方法; 浅显易懂的源码,很给力.

【转】Android 二维码 生成和识别(附Demo源码)--不错

原文网址:http://www.cnblogs.com/mythou/p/3280023.html 今天讲一下目前移动领域很常用的技术——二维码.现在大街小巷.各大网站都有二维码的踪迹,不管是IOS.Android.WP都有相关支持的软件.之前我就想了解二维码是如何工作,最近因为工作需要使用相关技术,所以做了初步了解.今天主要是讲解如何使用ZXing库,生成和识别二维码.这篇文章实用性为主,理论性不会讲解太多,有兴趣可以自己查看源码. 1.ZXing库介绍 这里简单介绍一下ZXing库.ZXin

Java基础知识强化41:StringBuffer类之StringBuffer的替换功能

1. StringBuffer的替换功能: public  StringBuffer   replace(int  start,  int  end, String  str): 2. 案例演示: 1 package cn.itcast_04; 2 3 /* 4 * StringBuffer的替换功能: 5 * public StringBuffer replace(int start,int end,String str):从start开始到end用str替换 6 */ 7 public cl

Java基础知识强化43:StringBuffer类之StringBuffer的截取功能

1. StringBuffer的截取功能: public String subString(int Start): public String subString(int Start, int end): 返回类型是String类型,和前面几个功能不一样,本身没有发生变化. 2. 案例演示: 1 package cn.itcast_06; 2 3 /* 4 * StringBuffer的截取功能:注意返回值类型不再是StringBuffer本身了 5 * public String substr