`
wdhdmx
  • 浏览: 300306 次
  • 性别: Icon_minigender_1
  • 来自: 山西
博客专栏
D4bbb5f7-9aa4-3e66-8194-f61b3f0241c2
天天编程
浏览量:21515
社区版块
存档分类
最新评论

StringBuffer源码理解

 
阅读更多

StringBuffer 存储和操作字符串

它所继承实现的类和接口

public final class StringBuffer   	extends AbstractStringBuilder   implements java.io.Serializable, CharSequence
 

一.构造函数

1.public StringBuffer( )

构造一个其中不带字符的字符串缓冲区,初始容量为 16 个字符。

StringBuffer.class

public StringBuffer() {
	super(16);
}

  AbstractStringBuilder.class

char value[];//存内容的字符数组





,StringBuffer中未定义新的变量,一直在操作父类定义的变量
AbstractStringBuilder(int capacity) {
        value = new char[capacity];//在这个例子中是16
}

2.public StringBuffer(int capacity)

构造一个不带字符,但具有指定初始容量的字符串缓冲区。

3.public StringBuffer(String str)

构造一个字符串缓冲区,并将其内容初始化为指定的字符串内容。该字符串的初始容量为 16 加上字符串参数的长度。

 StringBuffer.class

 public StringBuffer(String str) {
        //这个执行父类的带参构造函数AbstractStringBuilder(int capacity) 
        super(str.length() + 16);
	append(str);
}
public synchronized StringBuffer append(String str) {
        //执行父类的append(str)
        super.append(str);
        return this;
}

  AbstractStringBuilder.class

public AbstractStringBuilder append(String str) {
	if (str == null) str = "null";
        int len = str.length();
	if (len == 0) return this;
        //新的字符长度
	int newCount = count + len;
	if (newCount > value.length)
            //如果新的字符长度比字符数组分配的空间大,扩大容量
	    expandCapacity(newCount);
	//将字符从此字符串复制到目标字符数组。
	str.getChars(0, len, value, count);
	count = newCount;
	return this;
}       
char value[];//存内容的字符数组






 //扩张容量






void expandCapacity(int minimumCapacity) {
        //newCapacity 新容量,默认+1*2
	int newCapacity = (value.length + 1) * 2;
        if (newCapacity < 0) {
            //数字超过了Integer的最大值
            newCapacity = Integer.MAX_VALUE;
        } else if (minimumCapacity > newCapacity) {
            //默认扩大的容量还是不足存新的字符
	    newCapacity = minimumCapacity;
	}
        //将旧的值剪切到新的字符数组。
        value = Arrays.copyOf(value, newCapacity);
    }

二.append函数

append的步骤类似,

append(String str)

1.先判断是否为null,null就将str="null".

2.再判断str的长度是否为0,为0直接返回。

3.判断value[]字符数组的剩余空间够不够。

4.不够的话new一个char[] 空间为(原来+1)*2,并且判断时候超出Integer的最大值。然后System.arraycopy,将旧的字符数组复制到新的数组中

5.str.getChars,将str写入value[] 中。调用的也是System.arraycopy

append(Object obj)

先执行String.valueOf(obj),然后执行append(str)

append(StringBuffer sb)

第五步不同,调用StringBuffer的getChars方法,内部一样为System.arraycopy.

append(char c[])

1.直接相加计算新的字符长度,

2.长度不够扩张

3.System.arraycopy复制

append(CharSequence s)

1.判断s对象是String 或者StringBuffer的子类,分别调用append(str)或者append(sb)

2.如果不是,则利用value[count++] = s.charAt(i);

append(boolean b)

value[count++] = 't';
value[count++] = 'r';
value[count++] = 'u';
value[count++] = 'e';

append(int i)

 int appendedLength = (i < 0) ? stringSizeOfInt(-i) + 1 : stringSizeOfInt(i);//计算i的长度
 
final static int [] sizeTable = { 9, 99, 999, 9999, 99999, 999999, 9999999,99999999, 999999999, Integer.MAX_VALUE };
static int stringSizeOfInt(int x) {
        for (int i=0; ; i++)
            if (x <= sizeTable[i])
                return i+1;
}

 上面的代码计算出数字i的长度

然后利用Integer.getChars将i复制进value[]中,这个方法也很特别,以后再看。

append(long l)

 

  int appendedLength = (l < 0) ? stringSizeOfLong(-l) + 1 : stringSizeOfLong(l);
 
  static int stringSizeOfLong(long x) {
        long p = 10;
        for (int i=1; i<19; i++) {
            if (x < p)
                return i;
            p = 10*p;
        }
        return 19;
    }

 这个是计算long的长度的方法,利用Long.getChars将内容复制入新字符数组中

 

三.其它

删除   StringBuffer delete(int start, int end)

移除此序列的子字符串中的字符。系统直接将后面的字符用 System.arrayCopy复制面搜索的部分大删除起始点。删除掉了start ,end未删除。

删除一个 deleteCharAt(int index)

直接删除一个字符,相当于delete(index,index+1)

替换 replace(int start, int end, String str)

先看容量够不够,end后的内容利用System.arraCopy空出str的长度,然后将str复制进字符数组、

toString()

执行return new String(value, 0, count);

 

 

好了,就看到这吧。

 

 

分享到:
评论
1 楼 变脸小伙 2017-01-26  
运用到了场景中,希望接力

相关推荐

    java源码包---java 源码 大量 实例

    Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及... StringBuffer info=new StringBuffer(); /...

    JAVA上百实例源码以及开源项目源代码

    Java 源码包 Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作... StringBuffer info=new ...

    java8源码-jdk8:jdk8源码阅读理解

    jdk8源码的阅读理解 导入idea步骤: 阅读顺序: 大致思路 基本类型的包装类(Character放在最后) String、StringBuffer、StringBuilder、StringJoiner、StringTokenizer(补充正则表达式的知识) CharacterIterator、...

    JAVA上百实例源码以及开源项目

    笔者当初为了学习JAVA,收集了很多经典源码,源码难易程度分为初级、中级、高级等,详情看源码列表,需要的可以直接下载! 这些源码反映了那时那景笔者对未来的盲目,对代码的热情、执着,对IT的憧憬、向往!此时此...

    java源码包2

    Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行...

    java源码包3

    Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行...

    java源码包4

    Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行ATM机...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行ATM机...

    Java的String类讲解案例代码(String类使用:创建对象、比较、连接、截取、查找和替换、拆分...)StringBuf

    该源码资源会包含以下示例代码,以帮助开发者更好地理解和使用字符串操作类: String类使用(创建字符串对象、比较、长度、连接、截取、查找和替换、切割和拆分、和其他类型的转换、格式化、判断、手动入池、其他...

    安卓java读取网页源码-AndroidLearningNotes:第一次提交

    String、StringBuffer、StringBuilder区别 什么是内部类?内部类的作用 抽象类的意义 抽象类与接口的应用场景 抽象类是否可以没有方法和属性? 接口的意义 泛型中extends和super的区别 父类的静态方法能否被子类重写...

    java抢票软件源码-interview:java面试题整理

    java抢票软件源码 中高级java面试题整理 一 前端 简述一下HTTP请求的在客户端和服务端的请求过程 解答: get和post的基本区别?说说 tcp/ip协议、三次握手、窗口滑动机制 解答: 解答: 解答: 说说http,https协议; ...

    安卓java读取网页源码-questions:自问自答

    安卓java读取网页源码 questions 自问自答 待初答 注:认真对待每一个答案。 Java String、StringBuilder 和 StringBuffer 有什么区别 == 和 equals 和 hashCode 有什么区别 说说你对 final 修饰符的理解 说说你对...

    java基础案例与开发详解案例源码全

    9.2 StringBuffer类的使用231 9.3 StringBuilder类的使用233 9.4 日期类简介234 9.5 Java语言国际化时间获取与计算238 9.6 Random类和Math类240 9.7 本章习题243 第10章 10.1 异常概述246 10.2 使用try和catch捕获...

    Java中API介绍及常用API的总结

    1.什么是API? 可以理解为Java自己提供的标准类库,开发...而又无需访问源码,或理解内部工作机制的细节。 2.常用API 了解API是什么之后,再看一下Java中常用的API有哪些: System类 StringBuffer&StringBuilder类 Mat

    java范例开发大全(pdf&源码)

    1.1 理解Java 2 1.2 搭建Java所需环境 3 1.2.1 下载JDK 3 1.2.2 安装JDK 4 1.2.3 配置环境 5 1.2.4 测试JDK配置是否成功 7 实例1 开发第一个Java程序 7 第2章 Java基础类型与运算符(教学视频:39分钟) 9 2.1 基础...

    Java中常用的API— String、Math和System

    目的是提供应用程序与开发人员基于某软件或某硬件得以访问一组例程的能力,而又无需访问源码或理解工作的细节。 大白话就是别人写了个接口,我不必知道具体是怎么实现的,也不用去思考里面的构造怎么样的,我只需...

    疯狂JAVA讲义

    9.3.2 String、StringBuffer和StringBuilder类 322 9.3.3 Math类 327 9.3.4 Random类 328 9.3.5 BigDecimal类 330 9.4 处理日期的类 333 9.4.1 Date类 333 9.4.2 Calendar类 334 9.4.3 TimeZone类 337 9.5 ...

    Java范例开发大全(全书源程序)

    1.1 理解Java 2 1.2 搭建Java所需环境 3 1.2.1 下载JDK 3 1.2.2 安装JDK 4 1.2.3 配置环境 5 1.2.4 测试JDK配置是否成功 7 实例1 开发第一个Java程序 7 第2章 Java基础类型与运算符 实例2 自动提升 9 实例...

Global site tag (gtag.js) - Google Analytics