JAVA常用类之StringBuffer

简介:

上一篇博客中为大家介绍了String类的使用,这一篇再为大家介绍一个用于处理字符串的类StringBuffer。
在JDK API中对StringBuffer类的描述如下:
线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。
可将字符串缓冲区安全地用于多个线程。可以在必要时对这些方法进行同步,因此任意特定实例上的所有操作就好像是以串行顺序发生的,该顺序与所涉及的每个线程进行的方法调用顺序一致。
StringBuffer 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区中。append 方法始终将这些字符添加到缓冲区的末端;而 insert 方法则在指定的点添加字符。
例如,如果 z 引用一个当前内容为 “start” 的字符串缓冲区对象,则此方法调用 z.append(“le”) 会使字符串缓冲区包含 “startle”,而 z.insert(4, “le”) 将更改字符串缓冲区,使之包含 “starlet”。
当发生与源序列有关的操作(如源序列中的追加或插入操作)时,该类只在执行此操作的字符串缓冲区上而不是在源上实现同步。
每个字符串缓冲区都有一定的容量。只要字符串缓冲区所包含的字符序列的长度没有超出此容量,就无需分配新的内部缓冲区数组。如果内部缓冲区溢出,则此容量自动增大。从 JDK 5 开始,为该类补充了一个单个线程使用的等价类,即 StringBuilder。与该类相比,通常应该优先使用 StringBuilder 类,因为它支持所有相同的操作,但由于它不执行同步,所以速度更快。

构造方法

方法名 说明
StringBuffer() 构造一个其中不带字符的字符串缓冲区,其初始容量为 16 个字符。
StringBuffer(CharSequence seq) public java.lang.StringBuilder(CharSequence seq) 构造一个字符串缓冲区,它包含与指定的 CharSequence 相同的字符。
StringBuffer(int capacity) 构造一个不带字符,但具有指定初始容量的字符串缓冲区。
StringBuffer(String str) 构造一个字符串缓冲区,并将其内容初始化为指定的字符串内容。

方法摘要

返回值 方法名 说明
StringBuffer append(boolean b) 将 boolean 参数的字符串表示形式追加到序列
StringBuffer append(char c) 将 char 参数的字符串表示形式追加到此序列
StringBuffer append(char[] str) 将 char 数组参数的字符串表示形式追加到此序列
StringBuffer append(char[] str, int offset, int len) 将 char 数组参数的子数组的字符串表示形式追加到此序列
StringBuffer append(CharSequence s) 将指定的 CharSequence 追加到该序列
StringBuffer append(CharSequence s, int start, int end) 将指定 CharSequence 的子序列追加到此序列
StringBuffer append(double d) 将 double 参数的字符串表示形式追加到此序列
StringBuffer append(float f) 将 float 参数的字符串表示形式追加到此序列
StringBuffer append(int i) 将 int 参数的字符串表示形式追加到此序列
StringBuffer append(long lng) 将 long 参数的字符串表示形式追加到此序列
StringBuffer append(Object obj) 追加 Object 参数的字符串表示形式
StringBuffer append(String str) 将指定的字符串追加到此字符序列
StringBuffer append(StringBuffer sb) 将指定的 StringBuffer 追加到此序列中
StringBuffer appendCodePoint(int codePoint) 将 codePoint 参数的字符串表示形式追加到此序列
int capacity() 返回当前容量
char charAt(int index) 返回此序列中指定索引处的 char 值
int codePointAt(int index) 返回指定索引处的字符(统一代码点)
int codePointBefore(int index) 返回指定索引前的字符(统一代码点)
int codePointCount(int beginIndex, int endIndex) 返回此序列指定文本范围内的统一代码点
StringBuffer delete(int start, int end) 移除此序列的子字符串中的字符
StringBuffer deleteCharAt(int index) 移除此序列指定位置的 char
void ensureCapacity(int minimumCapacity) 确保容量至少等于指定的最小值
void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) 将字符从此序列复制到目标字符数组 dst
int indexOf(String str) 返回第一次出现的指定子字符串在该字符串中的索引
int indexOf(String str, int fromIndex) 从指定的索引处开始,返回第一次出现的指定子字符串在该字符串中的索引
StringBuffer insert(int offset, boolean b) 将 boolean 参数的字符串表示形式插入此序列中
StringBuffer insert(int offset, char c) 将 char 参数的字符串表示形式插入此序列中
StringBuffer insert(int offset, char[] str) 将 char 数组参数的字符串表示形式插入此序列中
StringBuffer insert(int index, char[] str, int offset, int len) 将数组参数 str 的子数组的字符串表示形式插入此序列中
StringBuffer insert(int dstOffset, CharSequence s) 将指定 CharSequence 插入此序列中
StringBuffer insert(int dstOffset, CharSequence s, int start, int end) 将指定 CharSequence 的子序列插入此序列中
StringBuffer insert(int offset, double d) 将 double 参数的字符串表示形式插入此序列中
StringBuffer insert(int offset, float f) 将 float 参数的字符串表示形式插入此序列中
StringBuffer insert(int offset, int i) 将 int 参数的字符串表示形式插入此序列中
StringBuffer insert(int offset, long l) 将 long 参数的字符串表示形式插入此序列中
StringBuffer insert(int offset, Object obj) 将 Object 参数的字符串表示形式插入此字符序列中
StringBuffer insert(int offset, String str) 将字符串插入此字符序列中
int lastIndexOf(String str) 返回最右边出现的指定子字符串在此字符串中的索引
int lastIndexOf(String str, int fromIndex) 返回最后一次出现的指定子字符串在此字符串中的索引
int length() 返回长度(字符数)
int offsetByCodePoints(int index, int codePointOffset) 返回此序列中的一个索引,该索引是从给定 index 偏移 codePointOffset 个代码点后得到的
StringBuffer replace(int start, int end, String str) 使用给定 String 中的字符替换此序列的子字符串中的字符
StringBuffer reverse() 将此字符序列用其反转形式取代
void setCharAt(int index, char ch) 将给定索引处的字符设置为 ch
void setLength(int newLength) 设置字符序列的长度
CharSequence subSequence(int start, int end) 返回一个新的字符序列,该字符序列是此序列的子序列
String substring(int start) 返回一个新的 String,它包含此字符序列当前所包含的字符子序列
String substring(int start, int end) 返回一个新的 String,它包含此序列当前所包含的字符子序列
String toString() 返回此序列中数据的字符串表示形式
void trimToSize() 尝试减少用于字符序列的存储空间

StringBuffer与String区别

简要的说, String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象, 因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后, JVM 的 GC 就会开始工作,那速度是一定会相当慢的。
而如果是使用 StringBuffer 类则结果就不一样了,每次结果都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,再改变对象引用。所以在一般情况下我们推荐使用 StringBuffer ,特别是字符串对象经常改变的情况下。
在通常情况下我们进行选择的顺序是:StringBuilder > StringBuffer > String。

StringBuffer示例

public class StringBufferDemo
{
   public static void main(String[] args)
   {
      StringBuffer buffer = new StringBuffer();
      buffer.append("jiang");
      System.out.println(buffer);
      buffer.append("guq");
      buffer.replace(buffer.length() - 1, buffer.length(), "jin");
      System.out.println(buffer);
      System.out.println(buffer.reverse());
   }
}

运行结果如下:
jiang
jianggujin
nijuggnaij

目录
相关文章
|
5天前
|
存储 安全 Java
java.util的Collections类
Collections 类位于 java.util 包下,提供了许多有用的对象和方法,来简化java中集合的创建、处理和多线程管理。掌握此类将非常有助于提升开发效率和维护代码的简洁性,同时对于程序的稳定性和安全性有大有帮助。
32 17
|
1天前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
19 4
|
2天前
|
Java 编译器 开发者
Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面
本文探讨了Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面,帮助开发者提高代码质量和程序的健壮性。
8 2
|
6天前
|
存储 安全 Java
如何保证 Java 类文件的安全性?
Java类文件的安全性可以通过多种方式保障,如使用数字签名验证类文件的完整性和来源,利用安全管理器和安全策略限制类文件的权限,以及通过加密技术保护类文件在传输过程中的安全。
|
10天前
|
Java 数据格式 索引
使用 Java 字节码工具检查类文件完整性的原理是什么
Java字节码工具通过解析和分析类文件的字节码,检查其结构和内容是否符合Java虚拟机规范,确保类文件的完整性和合法性,防止恶意代码或损坏的类文件影响程序运行。
|
10天前
|
Java API Maven
如何使用 Java 字节码工具检查类文件的完整性
本文介绍如何利用Java字节码工具来检测类文件的完整性和有效性,确保类文件未被篡改或损坏,适用于开发和维护阶段的代码质量控制。
|
10天前
|
存储 Java 编译器
java wrapper是什么类
【10月更文挑战第16天】
18 3
|
13天前
|
Java 程序员 测试技术
Java|让 JUnit4 测试类自动注入 logger 和被测 Service
本文介绍如何通过自定义 IDEA 的 JUnit4 Test Class 模板,实现生成测试类时自动注入 logger 和被测 Service。
20 5
|
13天前
|
Java
在Java多线程编程中,实现Runnable接口通常优于继承Thread类
【10月更文挑战第20天】在Java多线程编程中,实现Runnable接口通常优于继承Thread类。原因包括:1) Java只支持单继承,实现接口不受此限制;2) Runnable接口便于代码复用和线程池管理;3) 分离任务与线程,提高灵活性。因此,实现Runnable接口是更佳选择。
27 2
|
13天前
|
Java
Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口
【10月更文挑战第20天】《JAVA多线程深度解析:线程的创建之路》介绍了Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口。文章详细讲解了每种方式的实现方法、优缺点及适用场景,帮助读者更好地理解和掌握多线程编程技术,为复杂任务的高效处理奠定基础。
26 2