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…

java string 包含http_Java中使用HttpPost上传文件以及HttpGet进行API请求(包含HttpPost上传文件)...

一、HttpPost上传文件public static String getSuffix(final MultipartFile file){if(file null || file.getSize() 0){return null;}String fileName file.getOriginalFilename();return fileName.substring(fileName.lastIndexOf(".")1);}public static JSONObj…

java倒计时跳出窗口_java倒计时弹出框

直接使用java语言写出一个运行时的弹出框倒计时:package test.dagong.testDecreaseDate;import java.awt.Container;import java.awt.FlowLayout;import java.awt.Toolkit;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.sw…

jpa mysql存储过程_Jpa调用存储过程及参数

public List findAllEntityListBySearch(Long inputInfoId, int flag) throws Exception {List infoviewListnew ArrayList<>();EntityManager em emf.createEntityManager();try {StoredProcedureQuery storedProcedure em.createStoredProcedureQuery("存储名称&…

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

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

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

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

java 调用对象的方法_JAVA调用对象方法的执行过程

JAVA调用对象方法的执行过程&#xff1a;①.编译器查看对象的声明类型和方法名。假设调用x.f(parameter), 且隐式参数x声明为C类型的对象&#xff0c;有可能在C对象中存在多个参数类型和参数个数不同的f的方法{例如&#xff1a;f(int)、f(int,String)和f(String)}&#xff0c;…

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

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

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

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

java super extends_Java继承和super的用法

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼继承的关键字:extends格式如下: class 子类名 extends父类名{...}例如学生是继承人类这一父类的.class student extends person{...}如果一个类的声明没有使用关键字extends,则这个类默认是继承Object类的.Object是所有类的父类.Ob…

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

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

海天食品的java开发工作如何_再三个月就秋招了,我想找一份java开发工作,现在应该怎么准备一下?...

在找工作之前&#xff0c;大家都要做一些准备工作&#xff0c;java开发也是如此掌握核心JavaSE首先&#xff0c;从核心Java(JavaSE)开始学习&#xff0c;尽可能地掌握它。你应该了解和掌握一些基本概念&#xff0c;如循环&#xff0c;数组&#xff0c;运算符等等。此外&#xf…

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

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

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

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

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

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

java中兴参与实参相同_中兴通讯_传输SDH试题(含答案)

中兴传输SDH试题一、单项选择题(每小题2分&#xff0c;共30分)1、在SDH系统中, RSOH指(A)。A.再生段开销B.复用段开销C.再生段通道开销D.复用段通道开销2.、同步数字体系SDH具有(A)帧结构。A.块状B.串行C.链形D.三维3、管理指针单元的作用是(A)。A、用来指示信息净负荷的第一个…

php 正则提取url,php 正则表达式提取网页超级链接url的函数

function match_links($document) {preg_match_all("]))[^>]*>?(.*?)isx",$document,$links);while(list($key,$val) each($links[2])) {if(!empty($val))$match[link][] $val;}while(list($key,$val) each($links[3])) {if(!empty($val))$match[link][] …

php array colum,php5.5新数组函数array_column使用

array_column 用于获取二维数组中的元素(PHP 5 > 5.5.0)&#xff0c;但我们有时候需要在低版本中使用&#xff0c;那么就可以使用下面的代码即可PHP5.5发布了&#xff0c;其中增加了一个新的数组函数array_column&#xff0c;感觉不错的&#xff01;但是低版本PHP要使用&…

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

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

php+js+return+true,js中return、return false、return true的区别

1.语法及返回方式①返回控制与函数结果语法为:return 表达式;语句结果函数的执行,返回调用函数,而且把表达式的值作为函数结果返回出去②返回控制无函数结果语法为:return;在大多数情况下,为事件处理函数如果让其返回false,可以防止默认的事件行为.例如,默认情况下,点击一个标签…