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

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

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

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

85d3a82b0cafc44cc7f321e9e9b12f65.png

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/530152.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

rabbitmq java文档_RabbitMQ文档翻译——Hello World!(上)

文章主要翻译自RabbitMQ官方文档,主要是为了练习英语翻译,顺便学习一下RabbitMQ😶其中也记录了一些爬过的坑IntroductionRabbitMQ is a message broker. The principal idea is pretty simple: it accepts and forwards messages. You can th…

python从mongodb里取出数据进行可视化_python3 mongoDB数据库的安装配置与可视化

python3 mongoDB数据库的安装配置与可视化。前天说是要学习如何使用mongoDB的链接与安装。安装环境: wind10 还是盗版的 磁盘分析:只有一个C盘,步骤:1 . 下载这里下载了对应的msi文件,貌似.zip文件没有了2 我默认把mon…

idea 注入mapper报错报红的几种解决方案

文章目录 前言方法1:为 Autowired 注解设置required false方法2:用 Resource 替换 Autowired方法3:在Mapper接口上加上Repository注解方法4:用Lombok方法5:把IDEA的警告关闭掉方法6:不用管他 前言 相信大…

java类默认权限_Java 访问权限控制以及类初始化顺序

一. Package在一个项目中,不可以有相同的两个包名package语句必须是文件中除注释外第一句程序代码,否则不能通过编译。二. Java访问权限概述类成员:对于一个类,其成员(包括成员变量和成员方法)能否被其他类所访问,取决…

java http头 字符串转日期_springboot~DTO字符字段与日期字段的转换问题

不会自动转换string与date主要是这个意思,前端提交的JSON里,日期是一个字符串,而对应后端的实体里,它是一个Date的日期,这两个在默认情况下是不能自动转换的,我们先看一下实体实体public class UserDTO {pr…

比较abc大小的java_比较abc大小java

比较abc大小java[2021-02-09 04:04:20] 简介:php去除nbsp的方法:首先创建一个PHP代码示例文件;然后通过“preg_replace("/(\s|\&nbsp\;| |\xc2\xa0)/", " ", strip_tags($val));”方法去除所有nbsp即可。推荐:《PH…

java udp简单聊天程序_Java基于UDP协议实现简单的聊天室程序

最近比较闲,一直在抽空回顾一些java方面的技术应用。今天没什么事做,基于udp协议,写了一个非常简单的聊天室程序。现在的工作,很少用到socket,也算是对java网络编程方面的一个简单回忆。先看一下效果:实现的…

java9 反应编程_Java9第四篇-Reactive Stream API响应式编程

file我计划在后续的一段时间内,写一系列关于java 9的文章,虽然java 9 不像Java 8或者Java 11那样的核心java版本,但是还是有很多的特性值得关注。期待您能关注我,我将把java 9 写成一系列的文章,大概十篇左右。Java 9的…

bb10系统支持java吗_黑莓BB10怎么样 BlackBerry 10系统好用吗?

曾几何时黑莓Blackberry OS是一款十分受用户欢迎的手机系统,不过随着手机系统市场已经被苹果iOS、谷歌安卓、微软Windows Phone三分天下,致使曾经的黑莓帝国逐渐沦陷,体验和性能都已经明显跟不上iOS与安卓等系统的脚步了,也因为如…

php 将字符串打乱,PHP内部实现打乱字符串顺序函数str_shuffle的方法

前言2019年春节已过,今天是上班第一天,还得翻一翻之前没有看完的PHP源码。今天聊的是字符串顺序打乱函数str_shuffle。这个函数本身使用频率并不高。但是,其内部实现还是非常有趣的。str_shuffle() 函数随机地打乱字符串中的所有字符。要注意…

php strlen遇0截断,聊下php下的截断问题

0x01 起因有天在群里说起上传的%00截断的一些问题,就想起之前自己在这个问题踩过坑,想起了自己曾经的flag说要写文章,一直没写,现在来填坑了。0x02 经过源码理解1234//test.phpinclude "1.txt\000.jpg";?>1234//1.t…

test.php.bak,记一次phpmyadmin 4.8.1 远程文件包含漏洞(BUUCTF web)

题目很简单,一个滑稽打开源码,发现存在source.php文件于是访问文件,发现出现一串php源码提示存在hint.php,于是访问发现一句话flag not here, and flag in ffffllllaaaagggg再回过头来观察source.php明显是一道代码审计的问题&…

php中files和FILRS,php获取文件内容最后一行示例

php获取文件内容最后一行示例复制代码 代码如下:$rs README.md;$fp fopen($rs, r);fseek($fp,-1,SEEK_END);$s ;while(($c fgetc($fp)) ! false){if($c "\n" && $s) break;$s $c . $s;fseek($fp, -2, SEEK_CUR);}fclose($fp);echo $s;exit;时间&#x…

python 发邮件 抄送,Python调用outlook发送邮件,发送给多人、抄送给多人并带上附件...

我的报告目录具体解释在代码中有详细注释import win32com.client as win32import datetime, osaddressee test01qq.com;test02jd.com#收件人邮箱列表cc test02163.com;test03alibaba.com#抄送人邮件列表mail_path os.path.join(rC:\Users\songlihui\PycharmProjects\test001…

oracle监听 3个配置文件,Oracle 11g 监听 配置修改 说明

这里我们看2个比较常用的操作。1. 停止写listener log在某些特定的场合可能会有这样的需求。控制这个功能的参数是LOG_STATUS。 官网对这个参数的说明:To turn listenerlogging on or off.--在OS层面直接使用:lsnrctl SET LOG_STATUS {on | off}--在LSNR…

u盘分为windows和linux启动,【电脑软件】Ventoy 官方版,一个U盘,同时拥有启动win+linux+Ubuntu...

软件介绍:Ventoy是一个制作可启动U盘的开源工具。有了Ventoy你就无需反复地格式化U盘,你只需要把ISO文件拷贝到U盘里面就可以启动了,无需其他操作。 你可以一次性拷贝很多个不同类型的ISO文件,在启动时Ventoy会显示一个菜单来选择…

linux7 3怎么修改mac地址,Ubuntu 16.04修改MAC地址以及网络常用设置

1、先停止桌面版自带的NetworkManager,这东西很难用,且有些设置需要重启。sudo systemctl stop NetworkManager.servicesudo systemctl disable NetworkManager.service2、设置MAC地址在帮助文档中应该找这个关键字:hardware address&#xf…

Linux刻录光盘win10认不到,Win10无法读取DVD光驱和刻录光盘怎么办 Win10不能读取DVD光驱和刻录光盘解决方法...

近来,有位win10系统用户反映自己的电脑因为没有安装杀毒软件,而使电脑中了病毒,导致自己的DVD光驱不能使用,出现了无法读取光盘资料也无法刻录光盘的问题,而且DVD光驱显示的是CD驱动器。这该怎么办呢?下面&…

linux ubuntu安装 mono,在 Ubuntu Server 上安装配置 Mono 生产环境

在 Ubuntu Server 上安装配置 Mono 生产环境在 Ubuntu Server 上安装和配置 Apache2 + Mono 生产环境的记录。 服务器环境是 Ubuntu Server 13.04 虚拟机模式 (Virtual Machine Mode), 安装的 Mono 的版本是 3.2.1 , 最终环境如下图所示&…

c语言之函数存储属性,C语言:链接属性与存储类型

一、 链接属性C语言中链接属性决定如何处理在不同文件中出现的标示符。标示符的作用域与它的链接属性有关,但这两个属性并不相同。链接属性有3种: external(外部),internal(内部) 和 none(无)。1. none: 没有链接的标示符,总是被当…