Java中字符串StringBuffer和StringBuilder的使用
lipiwang 2025-03-18 23:52 5 浏览 0 评论
Java中表示字符串的有三个类:String、StringBuffer和StringBuilder。其中,String的长度是不可变的,而StringBuffer和StringBuilder是长度可变的。对于StringBuffer和StringBuilder来说,两者的API几乎一模一样,因为两者有共同的父类:AbstractStringBuilder。区别在于StringBuffer的大部分方法都是被synchronized关键字修饰,是线程安全的,而StringBuilder则与其相反。
所以本篇就对StringBuffer和StringBuilder类比着来进行介绍。
- 构造器
StringBuffer和StringBuilder的构造器都有三个,分别如下:
StringBuffer的构造器:
- new StringBuffer(int capacity)
- new StringBuffer(String str)
- new StringBuffer(CharSequence seq)
StringBuilder的构造器:
- new StringBuilder(int capacity)
- new StringBuilder(String str)
- new StringBuilder(CharSequence seq)
对比两者构造器发现,它们对构造器的重载都施行了同样的方式,可以传入一个整数的容量,可以传一个字符串值,甚至可以传一个字符序列的对象。对于Java来说,常用的字符序列对象就是我们认知中的String, StringBuffer和StringBuilder。关于StringBuilder和StringBuffer的使用的示例代码如下所示:
public class StringTest {
public static void main(String[] args) throws IOException {
// 初始化一个容量为16,但没有值的空StringBuffer对象
StringBuffer strBuffer = new StringBuffer(16);
System.out.println("strBuffer:" + strBuffer + ", 容量为:" + strBuffer.capacity() + ", 长度为:"
+ strBuffer.length());
// 初始化一个容量为16,但没有值的空StringBuilder对象
StringBuilder strBuilder = new StringBuilder(16);
System.out.println("strBuilder:" + strBuilder + ", 容量为:" + strBuilder.capacity() + ", 长度为:"
+ strBuilder.length());
// 根据一个字符串初始化一个StringBuffer对象
StringBuffer strBuffer2 = new StringBuffer("how are you");
System.out.println("strBuffer2的值为:" + strBuffer2 + ", 容量为:" + strBuffer2.capacity() + ", 长度为:"
+ strBuffer2.length());
// 根据一个字符串初始化一个StringBuilder对象
StringBuilder strBuilder2 = new StringBuilder("how old are you");
System.out.println("strBuilder2的值为:" + strBuilder2 + ", 容量为:" + strBuilder2.capacity() + ", 长度为:"
+ strBuilder2.length());
// 根据一个字符序列对象如StringBuilder来初始化一个StringBuffer对象
StringBuilder strBuffer3 = new StringBuilder(strBuilder);
System.out.println("strBuffer3的值为:" + strBuffer3 + ", 容量为:" + strBuffer3.capacity() + ", 长度为:"
+ strBuffer3.length());
// 根据一个字符序列对象如StringBuffer来初始化一个StringBuilder对象
StringBuilder strBuilder3 = new StringBuilder(strBuffer2);
System.out.println("strBuilder3的值为:" + strBuilder3 + ", 容量为:" + strBuilder3.capacity() + ", 长度为:"
+ strBuilder3.length());
}
}
执行结果如下图所示:
- 拼接参数
拼接参数常用的方法方法如下图:
也就是说,该方法可以拼接所有的基本数据类型和其对应的包装类型,字符数组、字符序列对象及其他的引用对象等。
StringBuilder和StringBuffer的append
其示例代码如下所示:
public class StringTest {
public static void main(String[] args) throws IOException {
// 可以拼接所有的基本数据类型
StringBuilder strBuilder = new StringBuilder();
StringBuffer strBuffer = new StringBuffer();
// 拼接int(byte、short都可以自动转换为int)
strBuilder.append(12).append(",");
strBuffer.append(12).append(",");
// 拼接long
strBuilder.append(13L).append(",");
strBuffer.append(13L).append(",");
// 拼接float
strBuilder.append(3.4f).append(",");
strBuffer.append(3.4f).append(",");
// 拼接double
strBuilder.append(3.5).append(",");
strBuffer.append(3.5).append(",");
// 拼接字符数组
strBuilder.append("hello".toCharArray()).append(",");
strBuffer.append("hello".toCharArray()).append(",");
// 拼接其他引用对象
strBuilder.append(new Date()).append(",");
strBuffer.append(new Date()).append(",");
// 拼接指定字符数组偏移指定位数后的指定长度字符
strBuilder.append("hello".toCharArray(), 2, 2).append(",");
strBuffer.append("hello".toCharArray(), 2, 2).append(",");
// 拼接指定字符序列对象(常见的为String、StringBuffer和StringBuilder)指定开始和结束(不包括)的字符串
strBuilder.append("hello", 1, 3).append(",");
strBuffer.append("hello", 1, 3).append(",");
printStrBuilder(strBuilder);
printStrBuffer(strBuffer);
}
private static void printStrBuilder(StringBuilder strBuilder) {
String[] strArr = strBuilder.deleteCharAt(strBuilder.length() - 1).toString().split(",");
System.out.println("StringBuilder信息为:\n" + Arrays.asList(strArr));
}
private static void printStrBuffer(StringBuffer strBuffer) {
String[] strArr = strBuffer.deleteCharAt(strBuffer.length() - 1).toString().split(",");
System.out.println("StringBuffer信息为:\n" + Arrays.asList(strArr));
}
}
只想结果如下图所示:
- 获取某个字符串在另一个字符串中的索引位置
这里使用的方法有四个,如下图:
相关的示例代码如下所示:
public class StringTest {
public static void main(String[] args) throws IOException {
StringBuilder strBuilder = new StringBuilder("no zuo no die no happy no problem");
StringBuffer strBuffer = new StringBuffer("no zuo no die no happy no problem");
// indexOf
System.out.println("\"no\"在strBuilder中首次出现的位置为:" + strBuilder.indexOf("no"));
System.out.println("\"no\"在strBuffer中首次出现的位置为:" + strBuffer.indexOf("no"));
System.out.println("\"no\"在strBuilder中在索引3之后首次出现的位置为:" + strBuilder.indexOf("no", 3));
System.out.println("\"no\"在strBuffer中在索引3之后首次出现的位置为:" + strBuffer.indexOf("no", 3));
// lastIndexOf
System.out.println("\"no\"在strBuilder中最后出现的位置为:" + strBuilder.lastIndexOf("no"));
System.out.println("\"no\"在strBuffer中最后出现的位置为:" + strBuffer.lastIndexOf("no"));
System.out.println("\"no\"在strBuilder中在索引20之前最后出现的位置为:" + strBuilder.lastIndexOf("no", 20));
System.out.println("\"no\"在strBuffer中在索引20之前最后出现的位置为:" + strBuffer.lastIndexOf("no", 20));
}
}
执行结果如下图所示:
- 插入方法
插入方法为:insert(int offset, XXX xxx), 目的是在偏移offset个字符后插入xxx。这里的xxx表示所有的基本数据类型及其对应的包装类型、字符数组、字符序列对象和其他的引用对象等。常用方法如下:
相关示例代码如下所示:
public class StringTest {
public static void main(String[] args) {
StringBuilder strBuilder = new StringBuilder("hello");
StringBuffer strBuffer = new StringBuffer("hello");
System.out.println("在strBuilder偏移2位后插入整数3的结果为:" + strBuilder.insert(2, 3));
System.out.println("在strBuffer偏移3位后插入整数3的结果为:" + strBuffer.insert(3, 3));
StringBuilder strBuilder2 = new StringBuilder("world");
StringBuffer strBuffer2 = new StringBuffer("world");
System.out.println("在strBuilder2偏移2位后插入'好'的结果为:" + strBuilder2.insert(2, '好'));
System.out.println("在strBuffer2偏移3位后插入'好'的结果为:" + strBuffer2.insert(3, '好'));
StringBuilder strBuilder3 = new StringBuilder("what");
StringBuffer strBuffer3 = new StringBuffer("what");
System.out.println("在strBuilder3偏移2位后插入4L的结果为:" + strBuilder3.insert(2, 4L));
System.out.println("在strBuffer3偏移3位后插入4L的结果为:" + strBuffer3.insert(3, 4L));
StringBuilder strBuilder4 = new StringBuilder("where");
StringBuffer strBuffer4 = new StringBuffer("where");
System.out.println("在strBuilder4偏移2位后插入3.14F的结果为:" + strBuilder4.insert(2, 3.14F));
System.out.println("在strBuffer4偏移3位后插入3.14F的结果为:" + strBuffer4.insert(3, 3.14F));
StringBuilder strBuilder5 = new StringBuilder("when");
StringBuffer strBuffer5 = new StringBuffer("when");
System.out.println("在strBuilder5偏移2位后插入1.414的结果为:" + strBuilder5.insert(2, 1.414));
System.out.println("在strBuffer5偏移3位后插入1.414的结果为:" + strBuffer5.insert(3, 1.414));
StringBuilder strBuilder6 = new StringBuilder("crazy");
StringBuffer strBuffer6 = new StringBuffer("crazy");
System.out.println("在strBuilder6偏移2位后插入true的结果为:" + strBuilder6.insert(2, true));
System.out.println("在strBuffer6偏移3位后插入false的结果为:" + strBuffer6.insert(3, false));
StringBuilder strBuilder7 = new StringBuilder("hehe");
StringBuffer strBuffer7 = new StringBuffer("hehe");
System.out.println("在strBuilder7偏移2位后插入Date的结果为:" + strBuilder7.insert(2, new Date()));
System.out.println("在strBuffer7偏移3位后插入Date的结果为:" + strBuffer7.insert(3, new Date()));
StringBuilder strBuilder8 = new StringBuilder("this");
StringBuffer strBuffer8 = new StringBuffer("this");
System.out.println("在strBuilder8偏移2位后插入字符数组['a', 'r', 'e']的结果为:"
+ strBuilder8.insert(2, new char[]{'a', 'r', 'e'}));
System.out.println("在strBuffer8偏移3位后插入字符数组['a', 'r', 'e']的结果为:"
+ strBuffer8.insert(3, new char[]{'a', 'r', 'e'}));
StringBuilder strBuilder9 = new StringBuilder("happend");
StringBuffer strBuffer9 = new StringBuffer("happend");
System.out.println("在strBuilder9偏移2位后插入Date的结果为:"
+ strBuilder9.insert(2, new StringBuffer("234")));
System.out.println("在strBuffer9偏移3位后插入Date的结果为:"
+ strBuffer9.insert(3, new StringBuilder("234")));
StringBuilder strBuilder10 = new StringBuilder("that");
StringBuffer strBuffer10 = new StringBuffer("that");
System.out.println("在strBuilder10偏移2位后插入字符数组['a', 'r', 'e']的结果为:"
+ strBuilder10.insert(2, new char[]{'a', 'r', 'e'}, 0, 2));
System.out.println("在strBuffer10偏移3位后插入字符数组['a', 'r', 'e']的结果为:"
+ strBuffer10.insert(3, new char[]{'a', 'r', 'e'}, 0, 2));
StringBuilder strBuilder11 = new StringBuilder("jerry");
StringBuffer strBuffer11 = new StringBuffer("jerry");
System.out.println("在strBuilder11偏移2位后插入Date的结果为:"
+ strBuilder11.insert(2, new StringBuffer("234"), 0, 2));
System.out.println("在strBuffer11偏移3位后插入Date的结果为:"
+ strBuffer11.insert(3, new StringBuilder("234"), 0, 2));
}
}
执行结果如下图所示:
- 删除某个或某些字符
删除某个或某些的字符方法如下图所示:
相关示例代码如下:
public class StringTest {
public static void main(String[] args) {
StringBuilder strBuilder = new StringBuilder("hello");
StringBuffer strBuffer = new StringBuffer("hello");
System.out.println("strBuilder删除索引为1处的字符后结果为:" + strBuilder.deleteCharAt(1));
System.out.println("strBuffer删除索引为1处的字符后结果为:" + strBuffer.deleteCharAt(1));
StringBuilder strBuilder2 = new StringBuilder("hello");
StringBuffer strBuffer2 = new StringBuffer("hello");
System.out.println("strBuilder2删除索引从1到3(不包括3)的字符后结果为:" + strBuilder2.delete(1, 3));
System.out.println("strBuffer2删除索引从1到3(不包括3)的字符后结果为:" + strBuffer2.delete(1, 3));
}
}
执行结果如下图所示:
- 取子字符串
取子字符串的方法如下:
示例代码如下所示:
public class StringTest {
public static void main(String[] args) {
StringBuilder strBuilder = new StringBuilder("hello world");
StringBuffer strBuffer = new StringBuffer("hello world");
System.out.println("strBuilder从索引3处开始到字符串末尾的子字符串为:" + strBuilder.substring(3));
System.out.println("strBuffer从索引3处开始到字符串末尾的子字符串为:" + strBuffer.substring(3));
StringBuilder strBuilder2 = new StringBuilder("hello world");
StringBuffer strBuffer2 = new StringBuffer("hello world");
System.out.println("strBuilder从索引3处开始到5(不包括5)的子字符串为:" + strBuilder.substring(3, 5));
System.out.println("strBuffer从索引3处开始到5(不包括5)的子字符串为:" + strBuffer.substring(3, 5));
}
}
执行结果如下图所示:
- 其他
除了以上列举的方法外,还有一些常用的方法,分别为:
- int capacity():获取容量(初始化字符数组的长度)
- int length():获取长度(实际字符的长度)
- replace(int start, int end, String str):将索引从start到end(不包括end)的字符序列替换为str
- char charAt(int index):获取指定索引出的字符
- void setCharAt(int index, char ch):用ch替换指定索引处的字符
- void setLength(int newwLength):将字符序列强制变为指定长度,多余的字符被置为null。
- CharSequence subSequence(int start, int end):获取子字符序列对象。
- reverse():将字符序列进行反转。
示例代码如下所示:
public class StringTest {
public static void main(String[] args) {
StringBuilder strBuilder = new StringBuilder("hello world");
StringBuffer strBuffer = new StringBuffer("hello world");
// 获取字符容量
System.out.println("strBuilder的容量为:" + strBuilder.capacity());
System.out.println("strBuffer的容量为:" + strBuffer.capacity());
// 获取长度
System.out.println("strBuilder的长度为:" + strBuilder.length());
System.out.println("strBuffer的长度为:" + strBuffer.length());
// 替换字符串
System.out.println("用\"tom\"替换strBuilder的0到5(不包括5)后结果为:"
+ strBuilder.replace(0, 5, "tom"));
System.out.println("用\"tom\"替换strBuffer的0到5(不包括5)后结果为:"
+ strBuffer.replace(0, 5, "tom"));
// 获取指定索引处的字符
System.out.println("strBuilder的索引为1的字符为:" + strBuilder.charAt(1));
System.out.println("strBuffer的索引为1的字符为:" + strBuffer.charAt(1));
// 将字符序列强制变为指定长度
strBuilder.setLength(3);
System.out.println("strBuilder强制变为长度为3的结果为:" + strBuilder);
strBuffer.setLength(3);
System.out.println("strBuffer强制变为长度为3的结果为:" + strBuffer);
// 取子字符序列
System.out.println("strBuilder的从0到2的子字符序列为:" + strBuilder.subSequence(0, 2));
System.out.println("strBuffer的从0到2的子字符序列为:" + strBuffer.subSequence(0, 2));
// 字符序列反转
System.out.println("strBuilder的反转后为:" + strBuilder.reverse());
System.out.println("strBuffer的反转为:" + strBuffer.reverse());
}
}
执行结果如下图所示:
自此,关于StringBuffer和StringBuilder的介绍就已经算是结束了。
相关推荐
- 超越JSON.parse:JavaScript中高效反序列化的艺术
-
当我们需要在网络间传输数据或将数据存储到本地存储时,我们通常会将JavaScript对象转换为字符串,然后在需要时再将其转换回对象,这就是数据序列化与反序列化。虽然JSON.parse()和JSON....
- 如何给别人网页上增加内容通过Chrome扩展为网页添加快速滚动功能
-
ContentScripts来看开发网站的介绍,ContentScripts是一类在网页上下文中运行的文件。它们可以使用标准的DOM接口,实现读取浏览器访问的网页的详细信息,比如网页的DOM结构...
- JavaScript执行栈和执行上下文(js 执行上下文与执行栈)
-
在JavaScript中,执行栈和执行上下文是理解代码执行流程和作用域链的关键概念。它们决定了代码如何执行以及变量和函数如何被查找和访问。本文将详细介绍执行上下文的生命周期、执行栈的工作原理以及它们在...
- 防止浏览器缓存特定JS文件的常用方法
-
防止浏览器缓存特定JavaScript文件的常用方法:1.添加版本号或时间戳在引用JavaScript文件时,在URL中添加一个版本号或时间戳作为查询参数。这样每次更新文件后修改这个参数值,就能让浏...
- 前端面试:JavaScript 字符串的常用方法?
-
JavaScript字符串是一种不可变的数据类型,因此在使用字符串时需要注意以下几个方法:charAt(i):返回指定索引位置的字符。concat(str[,start[,end]]):连接...
- Sequelize 在 Node.js 中的详细用法与使用笔记
-
1.Sequelize简介Sequelize是一个基于Promise的Node.jsORM(Object-RelationalMapping)工具,支持PostgreSQL、My...
- 前端js加密解密常用的六种方法(js加密解密源代码)
-
一、MD5加密可以使用md5插件进行加密插件地址:github.com/blueimp/JavaScript-MD5计算给定字符串值的(十六进制编码)MD5哈希值:计算给定字符串值和键的(十六进制编...
- javascript深拷贝浅拷贝原理分析(js深拷贝和浅拷贝如何实现)
-
用js处理数据的时候经常遇到这样一个问题,需要保留原始数据不变情况下,进行一系列数据操作,这时候需要制作一份原始数据的副本数据来进行操作注意的是引用数据类型和基本数据类型在内存中存储方式是不一样的,只...
- 1、从零开始了解和使用WPS的js宏(JSA)
-
最近使用了一下wps的宏本地客户端功能进行了数据查询,与vba相比感觉还是比较好用的。(所谓本地客户端就是指单机使用运行的wps程序)VBA因为长时间的发展,胜在功能比较强大,支持一些Active...
- JavaScript字符串查找方法总结(js查找子串)
-
在JavaScript中,查找字符串的常用方法有以下几种,根据不同的需求选择合适的方式:1.indexOf()/lastIndexOf()作用:查找子字符串首次出现的位置(indexOf)或...
- JavaScript 合并数组的三种方法(js数组合并的几种方法)
-
数组作为一种数据结构,表示索引项的有序集合。经常会使用到数组,尤其是将多个数组进行合并,比如将数组[1,2,3]和数组[4,5,6]合并,最终得到数组[1,2,3,4,5,6]。数组的合并分不...
- JS短文,如何正确理解Splice() 函数与Slice() 函数
-
转载说明:原创不易,未经授权,谢绝任何形式的转载Splice()函数与Slice()函数都是JavaScript数组中常用的方法之一。虽然它们的名称很相似,但它们的作用却截然不同。在这篇文章...
- JavaScript字符串concat()方法教程
-
一、简介JavaScript中的字符串是一种基本数据类型,它可以用单引号或双引号括起来。concat()方法用于将一个或多个字符串连接起来,并返回连接后的新字符串。concat()方法不会改变原始字符...
- 手把手教你常用的59个JS类方法(js几种类型)
-
前言前端开发有时会处理一部分后台返回的数据,或者根据数据判断做一些处理;这个时候就非常有必要将一些常用的工具类封装起来;本文根据常用的一些工具类封装了59个方法,当然还有很多用的较少前期没有录...
- js数组常用方法总结(js数组的使用)
-
首先说明,本文没技术含量,都是js的知识,只是为以后查阅方便。另外我们开了一个免费的讲解web前端课程,有兴趣的朋友可以去看,详情地址:http://fe.qietu.com/forum.php1、创...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- maven镜像 (69)
- undefined reference to (60)
- zip格式 (63)
- oracle over (62)
- date_format函数用法 (67)
- 在线代理服务器 (60)
- shell 字符串比较 (74)
- x509证书 (61)
- localhost (65)
- java.awt.headless (66)
- syn_sent (64)
- settings.xml (59)
- 弹出窗口 (56)
- applicationcontextaware (72)
- my.cnf (73)
- httpsession (62)
- pkcs7 (62)
- session cookie (63)
- java 生成uuid (58)
- could not initialize class (58)
- beanpropertyrowmapper (58)
- word空格下划线不显示 (73)
- jar文件 (60)
- jsp内置对象 (58)
- makefile编写规则 (58)