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

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 StringBuilder和StringBuffer源码分析

    `l'四个字符来表示`null`。如果`str`不为`null`,则计算`str`的长度`len`,通过`...理解它们的内部机制有助于优化代码,提高程序性能。在实际开发中,根据具体需求选择合适的数据结构是至关重要的。

    String与StringBuffer区别详解

    理解它们的区别对于编写高效、线程安全的代码至关重要。 1. **不可变性**: - `String`类是不可变的,意味着一旦创建,其内容就不能改变。每次对`String`对象进行修改(如连接、替换字符等),都会生成一个新的`...

    纯面向对象的思想jdbc编程,StringBuffer线程,线程习题

    源码阅读有助于提升编程技巧,理解底层原理,更好地优化代码。 由于没有提供具体的压缩包文件内容,我们无法进一步详细分析其中的具体知识点。不过,根据上述信息,我们可以预想内容可能包括如何使用JDBC进行数据库...

    浅析我对 String、StringBuilder、StringBuffer 的理解

    在Java编程语言中,String、StringBuilder和StringBuffer都是用来处理字符串的类,但它们之间存在显著的区别和使用场景。下面是对这三个类的深入理解和分析。 首先,String类是最常见的字符串对象,它以其不可变性...

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

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

    28个java常用的工具类源码

    了解并深入学习这些工具类的源码,对于提升编程技能、理解Java内部机制以及优化代码性能有着巨大的帮助。 首先,让我们逐一探讨这些工具类可能包括的内容: 1. **ArrayList和LinkedList**:这两个是Java集合框架中...

    java CharSequence、String、StringBuffer、StringBuilder详解

    通过分析提供的`String.java`、`StringBuffer.java`和`StringBuilder.java`源码,我们可以深入理解这些类的内部实现,例如它们如何处理字符序列,以及在进行字符串操作时的内存分配和性能优化策略。源码阅读有助于...

    java源码包2

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

    Java String、StringBuffer、StringBuilder(基于源码探索)

    在Java编程语言中,字符串处理是非常常见的操作。`String`、`StringBuffer`和`StringBuilder`都是用于构建和操作字符串的类...同时,深入研究源码可以帮助我们更好地理解这些类的内部工作机制,从而更高效地使用它们。

    java StringBuffer详解

    查看`StringBuffer`的源码,我们可以看到`append()`方法的实现: ```java public synchronized StringBuffer append(String str) { super.append(str); return this; } ``` 这里调用了父类`...

    Java源码阅读的真实体会.精选.doc

    Java源码阅读是一个深入理解Java技术体系的重要途径,它能帮助开发者提升技术水平,增强问题解决能力。以下是对Java源码阅读的一些关键知识点的详细说明: 首先,阅读源码需要一定的技术基础,这包括对Java语言的...

    JAVA源码阅读的真实体会.pdf

    阅读Java源码是一种深入理解语言本质和技术细节的重要方式,它能帮助开发者提升技术水平,增强问题解决能力。在开始源码阅读之前,有几点是至关重要的: 1. **技术基础**:阅读源码需要一定的编程基础,例如熟悉...

    api_StringBuffer.zip_fullvgv_java_tasteazi

    通过阅读源码,开发者可以深入理解Java的内存管理和多线程编程。 总结起来,`StringBuffer`是Java中处理字符串的重要工具,尤其在多线程场景下。它提供了一系列方便的方法来构建、修改和操作字符串,确保了线程安全...

    Java源码阅读的真实体会.pdf

    * 阅读源码可以帮助开发者更好地理解项目中部署和配置相关的核心类开发。 * 阅读源码可以帮助开发者更好地理解 Web 框架的实现。 七、 阅读源码的技巧 * 从 JDK 源代码开始阅读。 * 了解数据结构和算法。 * 了解 ...

    初步支持String和StringBuffer类

    理解它们的特性和使用场景对于优化Java程序的性能至关重要。在实际开发中,应根据需求选择合适的类,以实现最佳的代码质量和效率。阅读博客文章(链接已给出)可以获取更多关于这两个类的深入信息和实例。

    Scanner读取文件和StringBuffer读取文件

    在Java编程语言中,"Scanner读取文件"和"StringBuffer读取文件"是两种不同的文件操作方式,...在阅读标签“源码”和“工具”的相关资源时,理解这些基本概念和用法是非常重要的,可以帮助我们更好地进行Java开发工作。

    jdk1.8源码+中文注释(chm格式)

    源码是理解任何软件运行机制的钥匙,对于Java开发者来说,掌握JDK1.8的源码意味着能够更深入地理解其内部工作原理,从而编写出更高效、更健壮的代码。本文将基于提供的"jdk1.8源码+中文注释(chm格式)"进行详细的...

Global site tag (gtag.js) - Google Analytics