`
wu.sheng
  • 浏览: 66993 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

jdk6标准类库源码解读 之 java.lang(一) StringBuffer/StringBuilder

阅读更多

StringBuffer/StringBuilder

  • StringBuffer来自JDK 1.0,StringBuilder来自JDK 1.5。StringBuffer在1.5后被重构。两个类都基于1.5的AbstractStringBuilder。实现方式是一致的。StringBuffer的核心方法是线程安全的,使用了synchronized,StringBuilder则没有。
public final class StringBuffer extends AbstractStringBuilder

public final class StringBuilder extends AbstractStringBuilder
  •  字符串使用char数组进行存储,默认的初始大小为16。如果使用已知的字符串初始化,则初始化大小为已知字符串长度+16。
    /**
     * The value is used for character storage.
     */
    char value[];

    /**
     * The count is the number of characters used.
     */
    int count;

    public StringBuilder() {
        super(16);
    }

    public StringBuilder(String str) {
        super(str.length() + 16);
        append(str);
    }
  • append方法,append当发现存储空间不足时,会依照(当前长度+1)*2的计算原则,扩展存储空间,扩展方法基于底层的本地方法System.arraycopy方法,实现新、老存储空间内的char数据的快速拷贝。实现方法依赖于jre的底层实现。扩展的最大存储空间为int长度(231-1),超过时,不会发生异常,会忽略后面的字符串信息。
    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;
    }

    void expandCapacity(int minimumCapacity) {
        int newCapacity = (value.length + 1) * 2;
        if (newCapacity < 0) {
            newCapacity = Integer.MAX_VALUE;
        } else if (minimumCapacity > newCapacity) {
            newCapacity = minimumCapacity;
        }
        value = Arrays.copyOf(value, newCapacity);
    }

    public static char[] copyOf(char[] original, int newLength) {
        char[] copy = new char[newLength];
        System.arraycopy(original, 0, copy, 0,
                         Math.min(original.length, newLength));
        return copy;
    }
  •  delete方法,使用System.arraycopy的移位操作,覆盖原有的char值,同时修正len。剩下的空闲位不会处理。
    public AbstractStringBuilder delete(int start, int end) {
        if (start < 0)
            throw new StringIndexOutOfBoundsException(start);
        if (end > count)
            end = count;
        if (start > end)
            throw new StringIndexOutOfBoundsException();
        int len = end - start;
        if (len > 0) {
            System.arraycopy(value, start + len, value, start, count - end);
            count -= len;
        }
        return this;
    }
  •  toString方法,创建一个和当前StringBuffer/StringBuilder中值相同的字符串。
    public String toString() {
        // Create a copy, don't share the array
        return new String(value, 0, count);
    }

 

1
3
分享到:
评论

相关推荐

    JAVA设计模式在JDK中的应用

    Java作为一门流行的编程语言,其标准库(JDK)中巧妙地融入了多种设计模式的应用。本文将详细介绍在JDK中体现的23种经典设计模式,并通过具体的代码示例进行说明。 #### 二、设计模式分类 设计模式可以大致分为三类...

    java jdk 部分源码

    Java JDK 源码是Java开发者的宝贵资源,它揭示了Java平台的核心工作原理。这里主要探讨的是基于JDK 1.8.0_51版本的部分源码,结合了官方发布和第三方网站grepcode.com上的内容。尽管这部分源码可能未经过全面校对,...

    jdk1.7源码

    此外,JDK 1.7源码还包含了大量的标准库,如`java.lang`, `java.util`, `java.io`等,这些都是Java开发的基础。通过阅读这些类的源码,可以学习到各种设计模式,如工厂模式、单例模式、装饰器模式等,同时也能理解...

    Java rt.jar 源码分析

    Java的rt.jar是Java运行时库的核心组成部分,它包含了Java标准版(JRE)的类库,涵盖了Java语言的基础类,如Object、String、ArrayList、Thread等,以及I/O流、网络编程、反射、异常处理等多个核心功能的实现。源码...

    JDK中的记事本demo源码

    "JDK中的记事本demo源码"就是这样的一个例子,它展示了如何在Java中实现一个简单的文本编辑器,类似于Windows操作系统中的记事本应用。 这个源码对新手来说尤其有价值,因为它用的是标准的Java API,没有额外引入...

    java-ppt.rar_java .ppt_java ppt_java基础 ppt_java基础 ppt_ppt jav

    11. **Java标准库**:熟悉并学习Java提供的各种内置类和方法,如Math类,Date和Calendar类,以及IO和NIO库。 12. **IO到NIO的转变**:对比传统IO和New IO(NIO)模型,理解通道(Channel)和缓冲区(Buffer)的概念...

    java、宝典.docx

    本篇文章将深入探讨Java SE(标准版)编程基础,包括JDK、JRE和JVM的关系,面向过程与面向对象编程的区别,以及Java的基本数据类型、注释、数组与集合的差异等核心概念。 1. JDK、JRE和JVM的关系: JDK(Java ...

    2023年开发人员面试宝典Java版.docx

    JDK 中常用的包有 java.lang、java.util、java.io、java.net 等。这些包提供了基本的 Java 编程功能。 1.5 Java 中的基本数据类型 Java 中的基本数据类型有 byte、short、int、long、float、double、boolean、char...

    编程语言java高级应用.pdf

    JDK API是Java类库的核心部分,它定义了Java语言和标准库提供的各种类和方法。 2. java.lang.Object类:Object类是Java语言中所有类的根类,其他类都直接或间接地继承自Object类。Object类定义了几个重要的方法:...

    JAVA编程高级 工具类

    - `java.lang`包是最常用的包之一,包含了所有Java程序都默认导入的基础类,比如`String`、`Math`、`System`等。 - `java.util`包提供了许多实用的工具类,如`List`、`Set`、`Map`、`Calendar`等,对于处理数据和...

    JAVA中常用类的常用方法.docx

    JAVA 中常用类的常用方法 JAVA 中有许多常用的类,每个类都...在 JDK5.0 之后,JAVA 又引入了 StringBuilder 类,它和 StringBuffer 类类似,但是 StringBuilder 类是非线程安全的,而 StringBuffer 类是线程安全的。

    java源码解读-jdk_reading:java源码日常阅读与注解

    《Java源码解读——深入理解JDK》 Java作为一门广泛应用的编程语言,其源码是许多开发者探索技术原理、提升编程技能的重要资源。"java源码解读-jdk_reading:java源码日常阅读与注解"项目,旨在帮助开发者深入理解...

    String_raw-源码.rar

    这个“String_raw-源码.rar”文件很可能包含了Java标准库中`String`类的原始源代码,这对于深入理解`String`类的工作原理非常有帮助。在这里,我们将深入探讨`String`类的一些关键知识点。 1. **字符串常量池**:在...

    java基础资料

    Java是一种广泛使用的面向对象的编程语言,以其跨平台、高性能和强大的库支持而闻名。"老王java"可能是指一位名叫老王的教师或专家在Java教育领域的个人品牌。"java基础资料"涵盖的应该是Java编程的基础概念和技能,...

    谭浩强 Java编程技术.pdf

    6. **字符串处理**:Java中的String类是不可变的,书中会介绍String的基本操作,如拼接、查找、替换、截取等,并引入StringBuilder和StringBuffer类进行高效的字符串操作。 7. **数组**:包括一维数组和多维数组的...

    java 常用辅助工具类

    在Java编程中,辅助工具类是非常重要的一部分,它们提供了一系列常用的方法,帮助开发者高效地处理各种常见任务。这里我们主要探讨的是"java 常用辅助工具类",包括字符串操作、数字操作、数据库交互以及日期时间...

    Java课程介绍.pdf

    Java SE API中的java.util包含了Math,String,StringBuffer,StringBuilder等常用类,而java.io则提供了丰富的I/O类,用于文件读写和网络数据传输。Java SE还包括了JVM(Java虚拟机),JRE(Java运行环境)和JDK...

    34个java问题.pdf

    OpenJDK的代码库是Oracle JDK的基础之一,但两者在某些方面有所不同,比如构建系统、测试框架等。OpenJDK更适合希望使用开源软件的企业和个人。 #### 5. Java 和 C++ 的区别 - **内存管理**:Java通过自动垃圾回收...

    Java基础14共16页.pdf.zip

    12. **Java标准库**:Java标准库(JDK)包含了大量预先定义的类和接口,如IO、网络编程、日期时间API等。 13. **垃圾回收(GC)**:Java自动管理内存,通过垃圾回收机制回收不再使用的对象所占用的内存。 14. **...

    Java核心编程Java 课件ppt

    6. **字符串处理**:Java中的String类是不可变的,学习如何创建、比较和操作字符串,以及使用StringBuilder和StringBuffer类进行字符串拼接。 7. **异常处理**:学习try-catch-finally语句块,理解异常的分类和处理...

Global site tag (gtag.js) - Google Analytics