StringBuffer 是一个线程安全的可变的字符序列。它继承于AbstractStringBuilder,实现了CharSequence接口。

StringBuilder 也是继承于AbstractStringBuilder的子类;但是,StringBuilder和StringBuffer不同,前者是非线程安全的,后者是线程安全的。

StringBuffer 和 CharSequence之间的关系图如下:

StringBuffer类和String一样,也用来代表字符串,只是由于StringBuffer的内部实现方式和String不同,所以StringBuffer在进行字符串处理时,不生成新的对象,在内存使用上要优于String类。

所以在实际使用时,如果经常需要对一个字符串进行修改,例如插入、删除等操作,使用StringBuffer要更加适合一些。

在StringBuffer类中存在很多和String类一样的方法,这些方法在功能上和String类中的功能是完全一样的。

但是有一个最显著的区别在于,对于StringBuffer对象的每次修改都会改变对象自身,这点是和String类最大的区别。

另外由于StringBuffer是线程安全的,关于线程的概念后续有专门的章节进行介绍,所以在多线程程序中也可以很方便的进行使用,但是程序的执行效率相对来说就要稍微慢一些。

0.StringBuffer对象的初始化

StringBuffer对象的初始化不像String类的初始化一样,Java提供的有特殊的语法,而通常情况下一般使用构造方法进行初始化。

例如:

StringBuffer s = new StringBuffer();

这样初始化出的StringBuffer对象是一个空的对象。

如果需要创建带有内容的StringBuffer对象,则可以使用:

StringBuffer s = new StringBuffer(“abc”);

这样初始化出的StringBuffer对象的内容就是字符串”abc”。

需要注意的是,StringBuffer和String属于不同的类型,也不能直接进行强制类型转换,下面的代码都是错误的:

StringBuffer s = “abc”; //赋值类型不匹配

StringBuffer s = (StringBuffer)”abc”; //不存在继承关系,无法进行强转

StringBuffer对象和String对象之间的互转的代码如下:

String s = “abc”;

StringBuffer sb1 = new StringBuffer(“123”);

StringBuffer sb2 = new StringBuffer(s); //String转换为StringBuffer

String s1 = sb1.toString(); //StringBuffer转换为String

1.StringBuffer 函数列表

StringBuffer()

StringBuffer(int capacity)

StringBuffer(String string)

StringBuffer(CharSequence cs)

StringBuffer append(boolean b)

StringBuffer append(int i)

StringBuffer append(long l)

StringBuffer append(float f)

StringBuffer append(double d)

synchronized StringBuffer append(char ch)

synchronized StringBuffer append(char[] chars)

synchronized StringBuffer append(char[] chars, int start, int length)

synchronized StringBuffer append(Object obj)

synchronized StringBuffer append(String string)

synchronized StringBuffer append(StringBuffer sb)

synchronized StringBuffer append(CharSequence s)

synchronized StringBuffer append(CharSequence s, int start, int end)

StringBuffer appendCodePoint(int codePoint)

int capacity()

synchronized char charAt(int index)

synchronized int codePointAt(int index)

synchronized int codePointBefore(int index)

synchronized int codePointCount(int beginIndex, int endIndex)

synchronized StringBuffer delete(int start, int end)

synchronized StringBuffer deleteCharAt(int location)

synchronized void ensureCapacity(int min)

synchronized void getChars(int start, int end, char[] buffer, int idx)

synchronized int indexOf(String subString, int start)

int indexOf(String string)

StringBuffer insert(int index, boolean b)

StringBuffer insert(int index, int i)

StringBuffer insert(int index, long l)

StringBuffer insert(int index, float f)

StringBuffer insert(int index, double d)

synchronized StringBuffer insert(int index, char ch)

synchronized StringBuffer insert(int index, char[] chars)

synchronized StringBuffer insert(int index, char[] chars, int start, int length)

synchronized StringBuffer insert(int index, String string)

StringBuffer insert(int index, Object obj)

synchronized StringBuffer insert(int index, CharSequence s)

synchronized StringBuffer insert(int index, CharSequence s, int start, int end)

int lastIndexOf(String string)

synchronized int lastIndexOf(String subString, int start)

int length()

synchronized int offsetByCodePoints(int index, int codePointOffset)

synchronized StringBuffer replace(int start, int end, String string)

synchronized StringBuffer reverse()

synchronized void setCharAt(int index, char ch)

synchronized void setLength(int length)

synchronized CharSequence subSequence(int start, int end)

synchronized String substring(int start)

synchronized String substring(int start, int end)

synchronized String toString()

synchronized void trimToSize()

2. StringBuffer 示例源码如下(StringBufferTest.java):

/**

* StringBuffer 演示程序

*/

import java.util.HashMap;

public class StringBufferTest {

public static void main(String[] args) {

testInsertAPIs() ;

testAppendAPIs() ;

testReplaceAPIs() ;

testDeleteAPIs() ;

testIndexAPIs() ;

testOtherAPIs() ;

}

/**

* StringBuffer 的其它API示例

*/

private static void testOtherAPIs() {

System.out.println("-------------------------------- testOtherAPIs --------------------------------");

StringBuffer sbuilder = new StringBuffer("0123456789");

int cap = sbuilder.capacity();

System.out.printf("cap=%d\n", cap);

char c = sbuilder.charAt(6);

System.out.printf("c=%c\n", c);

char[] carr = new char[4];

sbuilder.getChars(3, 7, carr, 0);

for (int i=0; i

System.out.printf("carr[%d]=%c ", i, carr[i]);

System.out.println();

System.out.println();

}

/**

* StringBuffer 中index相关API演示

*/

private static void testIndexAPIs() {

System.out.println("-------------------------------- testIndexAPIs --------------------------------");

StringBuffer sbuilder = new StringBuffer("abcAbcABCabCaBcAbCaBCabc");

System.out.printf("sbuilder=%s\n", sbuilder);

// 1. 从前往后,找出"bc"第一次出现的位置

System.out.printf("%-30s = %d\n", "sbuilder.indexOf(\"bc\")", sbuilder.indexOf("bc"));

// 2. 从位置5开始,从前往后,找出"bc"第一次出现的位置

System.out.printf("%-30s = %d\n", "sbuilder.indexOf(\"bc\", 5)", sbuilder.indexOf("bc", 5));

// 3. 从后往前,找出"bc"第一次出现的位置

System.out.printf("%-30s = %d\n", "sbuilder.lastIndexOf(\"bc\")", sbuilder.lastIndexOf("bc"));

// 4. 从位置4开始,从后往前,找出"bc"第一次出现的位置

System.out.printf("%-30s = %d\n", "sbuilder.lastIndexOf(\"bc\", 4)", sbuilder.lastIndexOf("bc", 4));

System.out.println();

}

/**

* StringBuffer 的replace()示例

*/

private static void testReplaceAPIs() {

System.out.println("-------------------------------- testReplaceAPIs ------------------------------");

StringBuffer sbuilder;

sbuilder = new StringBuffer("0123456789");

sbuilder.replace(0, 3, "ABCDE");

System.out.printf("sbuilder=%s\n", sbuilder);

sbuilder = new StringBuffer("0123456789");

sbuilder.reverse();

System.out.printf("sbuilder=%s\n", sbuilder);

sbuilder = new StringBuffer("0123456789");

sbuilder.setCharAt(0, 'M');

System.out.printf("sbuilder=%s\n", sbuilder);

System.out.println();

}

/**

* StringBuffer 的delete()示例

*/

private static void testDeleteAPIs() {

System.out.println("-------------------------------- testDeleteAPIs -------------------------------");

StringBuffer sbuilder = new StringBuffer("0123456789");

// 删除位置0的字符,剩余字符是“123456789”。

sbuilder.deleteCharAt(0);

// 删除位置3(包括)到位置6(不包括)之间的字符,剩余字符是“123789”。

sbuilder.delete(3,6);

// 获取sb中从位置1开始的字符串

String str1 = sbuilder.substring(1);

// 获取sb中从位置3(包括)到位置5(不包括)之间的字符串

String str2 = sbuilder.substring(3, 5);

// 获取sb中从位置3(包括)到位置5(不包括)之间的字符串,获取的对象是CharSequence对象,此处转型为String

String str3 = (String)sbuilder.subSequence(3, 5);

System.out.printf("sbuilder=%s\nstr1=%s\nstr2=%s\nstr3=%s\n",

sbuilder, str1, str2, str3);

System.out.println();

}

/**

* StringBuffer 的insert()示例

*/

private static void testInsertAPIs() {

System.out.println("-------------------------------- testInsertAPIs -------------------------------");

StringBuffer sbuilder = new StringBuffer();

// 在位置0处插入字符数组

sbuilder.insert(0, new char[]{'a','b','c','d','e'});

// 在位置0处插入字符数组。0表示字符数组起始位置,3表示长度

sbuilder.insert(0, new char[]{'A','B','C','D','E'}, 0, 3);

// 在位置0处插入float

sbuilder.insert(0, 1.414f);

// 在位置0处插入double

sbuilder.insert(0, 3.14159d);

// 在位置0处插入boolean

sbuilder.insert(0, true);

// 在位置0处插入char

sbuilder.insert(0, '\n');

// 在位置0处插入int

sbuilder.insert(0, 100);

// 在位置0处插入long

sbuilder.insert(0, 12345L);

// 在位置0处插入StringBuilder对象

sbuilder.insert(0, new StringBuffer("StringBuilder"));

// 在位置0处插入StringBuilder对象。6表示被在位置0处插入对象的起始位置(包括),13是结束位置(不包括)

sbuilder.insert(0, new StringBuffer("STRINGBUILDER"), 6, 13);

// 在位置0处插入StringBuffer对象。

sbuilder.insert(0, new StringBuffer("StringBuffer"));

// 在位置0处插入StringBuffer对象。6表示被在位置0处插入对象的起始位置(包括),12是结束位置(不包括)

sbuilder.insert(0, new StringBuffer("STRINGBUFFER"), 6, 12);

// 在位置0处插入String对象。

sbuilder.insert(0, "String");

// 在位置0处插入String对象。1表示被在位置0处插入对象的起始位置(包括),6是结束位置(不包括)

sbuilder.insert(0, "0123456789", 1, 6);

sbuilder.insert(0, '\n');

// 在位置0处插入Object对象。此处以HashMap为例

HashMap map = new HashMap();

map.put("1", "one");

map.put("2", "two");

map.put("3", "three");

sbuilder.insert(0, map);

System.out.printf("%s\n\n", sbuilder);

}

/**

* StringBuffer 的append()示例

*/

private static void testAppendAPIs() {

System.out.println("-------------------------------- testAppendAPIs -------------------------------");

StringBuffer sbuilder = new StringBuffer();

// 追加字符数组

sbuilder.append(new char[]{'a','b','c','d','e'});

// 追加字符数组。0表示字符数组起始位置,3表示长度

sbuilder.append(new char[]{'A','B','C','D','E'}, 0, 3);

// 追加float

sbuilder.append(1.414f);

// 追加double

sbuilder.append(3.14159d);

// 追加boolean

sbuilder.append(true);

// 追加char

sbuilder.append('\n');

// 追加int

sbuilder.append(100);

// 追加long

sbuilder.append(12345L);

// 追加StringBuilder对象

sbuilder.append(new StringBuffer("StringBuilder"));

// 追加StringBuilder对象。6表示被追加对象的起始位置(包括),13是结束位置(不包括)

sbuilder.append(new StringBuffer("STRINGBUILDER"), 6, 13);

// 追加StringBuffer对象。

sbuilder.append(new StringBuffer("StringBuffer"));

// 追加StringBuffer对象。6表示被追加对象的起始位置(包括),12是结束位置(不包括)

sbuilder.append(new StringBuffer("STRINGBUFFER"), 6, 12);

// 追加String对象。

sbuilder.append("String");

// 追加String对象。1表示被追加对象的起始位置(包括),6是结束位置(不包括)

sbuilder.append("0123456789", 1, 6);

sbuilder.append('\n');

// 追加Object对象。此处以HashMap为例

HashMap map = new HashMap();

map.put("1", "one");

map.put("2", "two");

map.put("3", "three");

sbuilder.append(map);

sbuilder.append('\n');

// 追加unicode编码

sbuilder.appendCodePoint(0x5b57); // 0x5b57是“字”的unicode编码

sbuilder.appendCodePoint(0x7b26); // 0x7b26是“符”的unicode编码

sbuilder.appendCodePoint(0x7f16); // 0x7f16是“编”的unicode编码

sbuilder.appendCodePoint(0x7801); // 0x7801是“码”的unicode编码

System.out.printf("%s\n\n", sbuilder);

}

}

运行结果:

-------------------------------- testInsertAPIs -------------------------------

{3=three, 2=two, 1=one}

12345StringBUFFERStringBufferBUILDERStringBuilder12345100

true3.141591.414ABCabcde

-------------------------------- testAppendAPIs -------------------------------

abcdeABC1.4143.14159true

10012345StringBuilderBUILDERStringBufferBUFFERString12345

{3=three, 2=two, 1=one}

字符编码

-------------------------------- testReplaceAPIs ------------------------------

sbuilder=ABCDE3456789

sbuilder=9876543210

sbuilder=M123456789

-------------------------------- testDeleteAPIs -------------------------------

sbuilder=123789

str1=23789

str2=78

str3=78

-------------------------------- testIndexAPIs --------------------------------

sbuilder=abcAbcABCabCaBcAbCaBCabc

sbuilder.indexOf("bc") = 1

sbuilder.indexOf("bc", 5) = 22

sbuilder.lastIndexOf("bc") = 22

sbuilder.lastIndexOf("bc", 4) = 4

-------------------------------- testOtherAPIs --------------------------------

cap=26

c=6

carr[0]=3 carr[1]=4 carr[2]=5 carr[3]=6

java 字符串缓冲区_详解Java中字符串缓冲区StringBuffer类的使用相关推荐

  1. java comparator相等_详解Java中Comparable和Comparator接口的区别

    详解Java中Comparable和Comparator接口的区别 发布于 2020-7-20| 复制链接 摘记: 详解Java中Comparable和Comparator接口的区别本文要来详细分析一 ...

  2. Java implement意思_详解JAVA中implement和extends的区别

    详解JAVA中implement和extends的区别 发布于 2020-4-14| 复制链接 摘记: 详解JAVA中implement和extends的区别extends是继承父类,只要那个类不是声 ...

  3. java sleep唤醒_详解Java中的线程让步yield()与线程休眠sleep()方法

    Java中的线程让步会让线程让出优先级,而休眠则会让线程进入阻塞状态等待被唤醒,这里我们对比线程等待的wait()方法,来详解Java中的线程让步yield()与线程休眠sleep()方法 线程让步: ...

  4. java runnable 异常_详解Java中多线程异常捕获Runnable的实现

    详解Java中多线程异常捕获Runnable的实现 1.背景: Java 多线程异常不向主线程抛,自己处理,外部捕获不了异常.所以要实现主线程对子线程异常的捕获. 2.工具: 实现Runnable接口 ...

  5. java 代码块_详解java中的四种代码块

    在java中用{}括起来的称为代码块,代码块可分为以下四种: 一.简介 1.普通代码块: 类中方法的方法体 2.构造代码块: 构造块会在创建对象时被调用,每次创建时都会被调用,优先于类构造函数执行. ...

  6. java static 函数_详解java中的static关键字

    Java中的static关键字可以用于修饰变量.方法.代码块和类,还可以与import关键字联合使用,使用的方式不同赋予了static关键字不同的作用,且在开发中使用广泛,这里做一下深入了解. 静态资 ...

  7. java 标量替换_详解jvm中的标量替换

    概述 通常在java中创建一个对象,大家都认为是在堆中创建. 在jdk6开始有逃逸分析,标量替换等技术,关于在堆中创建对象不再绝对. 关于标量替换,通过以下几点进行概述: 逃逸分析 标量替换是什么 测 ...

  8. java内部格式_详解java内部类的访问格式和规则

    详解java内部类的访问格式和规则 1.内部类的定义 定义一个类来描述事物,但是这个事物其中可能还有事物,这时候在类中再定义类来描述. 2.内部类访问规则 ①内部类可以直接访问外部类中的成员,包括私有 ...

  9. java 引用传递_详解java的值传递、地址传递、引用传递

    详解java的值传递.地址传递.引用传递 一直来觉得对值传递和地址传递了解的很清楚,刚才在开源中国上看到一篇帖子介绍了java中的值传递和地址传递,看完后感受颇深.下边总结下以便更容易理解. 按照以前 ...

  10. python java混合编程_详解java调用python的几种用法(看这篇就够了)

    java调用python的几种用法如下: 在java类中直接执行python语句 在java类中直接调用本地python脚本 使用Runtime.getRuntime()执行python脚本文件(推荐 ...

最新文章

  1. Python的 if .else.elif语句详解
  2. endl、flush、ends、unitbuf、nounitbuf区别及详解
  3. 最大子矩阵(普通和01)
  4. mysql删除索引 增加索引
  5. mysql ticks_【原创】C# 计时周期数(Ticks)在不同数据库上的实现
  6. header里面加值如何去掉引号_用ods tagsets.rtf 产生的表,怎么去掉页尾处的空白?...
  7. 机器学习算法之CART(分类回归树)概要
  8. 静态、动态函数库的设计
  9. 条形码、二维码的区别和组成结构介绍
  10. 如何获取集合里面的下标_怎样获取list集合中的最后一个对象中的值
  11. 施乐3030服务器系统安装,施乐DW3030驱动安装步骤
  12. UFS 理解 - Reference Clock
  13. 【C系列】How to printf “unsigned long” in C?
  14. python基础知识ppt
  15. Linux服务器性能评估
  16. 最新版FusionCharts2D面积图
  17. Flutter中解决AndroidX包与Support包冲突问题
  18. Java垃圾收集学习笔记
  19. 全球与中国吸油烟机行业市场规模调研及未来前瞻报告2022-2028年
  20. 对Java开发的现状和未来发展的思考,专题解析

热门文章

  1. 人生苦短,Python之父要解开这个困惑
  2. Cloud一分钟 | 谷歌关闭社交平台;亚马逊云服务拿下10亿美元订单,劲敌微软败走麦城...
  3. html5 vr效果,HTML5 Three.js 虚拟现实小实验(VR Experiment)
  4. 北语18春《计算机网络技术》作业4,北语18春《计算机网络技术》作业4
  5. ETL异构数据源Datax_工具部署_02
  6. linux crontab定时任务常用梳理
  7. Mybatis代码生成适配Oracle和Mysql数据库_01
  8. 使用IntelliJ IDEA 2020 高效开发 springboot项目
  9. Excel 表单控件之 CheckBox 集合事件响应
  10. mysql root命令_MySQL 修改 root 密码命令