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);
}
分享到:
相关推荐
Java作为一门流行的编程语言,其标准库(JDK)中巧妙地融入了多种设计模式的应用。本文将详细介绍在JDK中体现的23种经典设计模式,并通过具体的代码示例进行说明。 #### 二、设计模式分类 设计模式可以大致分为三类...
Java JDK 源码是Java开发者的宝贵资源,它揭示了Java平台的核心工作原理。这里主要探讨的是基于JDK 1.8.0_51版本的部分源码,结合了官方发布和第三方网站grepcode.com上的内容。尽管这部分源码可能未经过全面校对,...
此外,JDK 1.7源码还包含了大量的标准库,如`java.lang`, `java.util`, `java.io`等,这些都是Java开发的基础。通过阅读这些类的源码,可以学习到各种设计模式,如工厂模式、单例模式、装饰器模式等,同时也能理解...
Java的rt.jar是Java运行时库的核心组成部分,它包含了Java标准版(JRE)的类库,涵盖了Java语言的基础类,如Object、String、ArrayList、Thread等,以及I/O流、网络编程、反射、异常处理等多个核心功能的实现。源码...
"JDK中的记事本demo源码"就是这样的一个例子,它展示了如何在Java中实现一个简单的文本编辑器,类似于Windows操作系统中的记事本应用。 这个源码对新手来说尤其有价值,因为它用的是标准的Java API,没有额外引入...
11. **Java标准库**:熟悉并学习Java提供的各种内置类和方法,如Math类,Date和Calendar类,以及IO和NIO库。 12. **IO到NIO的转变**:对比传统IO和New IO(NIO)模型,理解通道(Channel)和缓冲区(Buffer)的概念...
本篇文章将深入探讨Java SE(标准版)编程基础,包括JDK、JRE和JVM的关系,面向过程与面向对象编程的区别,以及Java的基本数据类型、注释、数组与集合的差异等核心概念。 1. JDK、JRE和JVM的关系: JDK(Java ...
JDK 中常用的包有 java.lang、java.util、java.io、java.net 等。这些包提供了基本的 Java 编程功能。 1.5 Java 中的基本数据类型 Java 中的基本数据类型有 byte、short、int、long、float、double、boolean、char...
JDK API是Java类库的核心部分,它定义了Java语言和标准库提供的各种类和方法。 2. java.lang.Object类:Object类是Java语言中所有类的根类,其他类都直接或间接地继承自Object类。Object类定义了几个重要的方法:...
- `java.lang`包是最常用的包之一,包含了所有Java程序都默认导入的基础类,比如`String`、`Math`、`System`等。 - `java.util`包提供了许多实用的工具类,如`List`、`Set`、`Map`、`Calendar`等,对于处理数据和...
JAVA 中常用类的常用方法 JAVA 中有许多常用的类,每个类都...在 JDK5.0 之后,JAVA 又引入了 StringBuilder 类,它和 StringBuffer 类类似,但是 StringBuilder 类是非线程安全的,而 StringBuffer 类是线程安全的。
《Java源码解读——深入理解JDK》 Java作为一门广泛应用的编程语言,其源码是许多开发者探索技术原理、提升编程技能的重要资源。"java源码解读-jdk_reading:java源码日常阅读与注解"项目,旨在帮助开发者深入理解...
这个“String_raw-源码.rar”文件很可能包含了Java标准库中`String`类的原始源代码,这对于深入理解`String`类的工作原理非常有帮助。在这里,我们将深入探讨`String`类的一些关键知识点。 1. **字符串常量池**:在...
Java是一种广泛使用的面向对象的编程语言,以其跨平台、高性能和强大的库支持而闻名。"老王java"可能是指一位名叫老王的教师或专家在Java教育领域的个人品牌。"java基础资料"涵盖的应该是Java编程的基础概念和技能,...
6. **字符串处理**:Java中的String类是不可变的,书中会介绍String的基本操作,如拼接、查找、替换、截取等,并引入StringBuilder和StringBuffer类进行高效的字符串操作。 7. **数组**:包括一维数组和多维数组的...
在Java编程中,辅助工具类是非常重要的一部分,它们提供了一系列常用的方法,帮助开发者高效地处理各种常见任务。这里我们主要探讨的是"java 常用辅助工具类",包括字符串操作、数字操作、数据库交互以及日期时间...
Java SE API中的java.util包含了Math,String,StringBuffer,StringBuilder等常用类,而java.io则提供了丰富的I/O类,用于文件读写和网络数据传输。Java SE还包括了JVM(Java虚拟机),JRE(Java运行环境)和JDK...
OpenJDK的代码库是Oracle JDK的基础之一,但两者在某些方面有所不同,比如构建系统、测试框架等。OpenJDK更适合希望使用开源软件的企业和个人。 #### 5. Java 和 C++ 的区别 - **内存管理**:Java通过自动垃圾回收...
12. **Java标准库**:Java标准库(JDK)包含了大量预先定义的类和接口,如IO、网络编程、日期时间API等。 13. **垃圾回收(GC)**:Java自动管理内存,通过垃圾回收机制回收不再使用的对象所占用的内存。 14. **...
6. **字符串处理**:Java中的String类是不可变的,学习如何创建、比较和操作字符串,以及使用StringBuilder和StringBuffer类进行字符串拼接。 7. **异常处理**:学习try-catch-finally语句块,理解异常的分类和处理...