Java核心-核心类与API(2)

话接上回,继续核心类与API的学习,这次介绍StringBuffer/StringBuilder/StringJoiner类。StringBuffer和StringBuilder是我们学习的重点,建议对比学习,做好区分。
在这里插入图片描述

一、StringBuffer类

1、概述

1)问题
由于 String 类是final 类型的,所以使用 String 定义的字符串是一个常量,一旦创建,其内容和长度是不可改变的。如果需要对一个字符串进行修改,只能创建新的字符串。
2)解决
使用 StringBuffer 类(也称字符串缓冲区)来操作字符串。

StringBuffer 类和 String 类最大的区别在于它的内容和长度都是可以改变的。StringBuffer 类似一个字符容器,当在其中添加或删除字符时,所操作的都是这个字符容器,因此并不会产生新的 StringBuffer 对象。

2、创建StringBuffer类对象

2.1 三种方式

1)StringBuffer() 构造一个空的字符串缓冲区,并初始化为 16 个字符的容量。
2)StringBuffer(int length) 创建一个空的字符串缓冲区,并初始化为指定长度 length 的容量。
3)StringBuffer(String str) 创建一个字符串缓冲区,并将其内容初始化为指定的字符串内容 str,字符串缓冲区的初始容量为 16 加上字符串 str 的长度。

2.2 案例

看文字不好理解的话就看如下案例

// 定义一个空的字符串缓冲区,含有16个字符的容量
StringBuffer str1 = new StringBuffer();
// 定义一个含有10个字符容量的字符串缓冲区
StringBuffer str2 = new StringBuffer(10);
// 定义一个含有(16+4)的字符串缓冲区,"青春无悔"为4个字符
StringBuffer str3 = new StringBuffer("青春无悔");
/*
*输出字符串的容量大小
*capacity()方法返回字符串的容量大小
*/
System.out.println(str1.capacity());    // 输出 16
System.out.println(str2.capacity());    // 输出 10
System.out.println(str3.capacity());    // 输出 20

注:当不指定容量(capacity)时默认构造一个容量为16的对象。

3、String与StringBuffer对象的转换

直接看案例

public class StringBufferDemo1 {public static void main(String[] args){String s = "abc";  //String转StringBufferStringBuffer s1= new StringBuffer(s);System.out.println(s1);  //abcStringBuffer str=new StringBuffer("javaee");String str1=str.toString();  //StringBuffer转String(toString方法)System.out.println(str1);  //javaee}
}

4、StringBuffer类常用方法

常用的有append、delete、insert、replace、reverse、toString、setCharAt(修改指定位置index处的字符)等方法,其他方法和String类似,可自行对照来看。直接看懂以下案例即可

public class StringBufferDemo1 {public static void main(String[] args) {StringBuffer s = new StringBuffer("Happy New Year!");s.append(" 你好 2023!");System.out.println(s);  //Happy New Year! 你好 2023!s.insert(6, "happy ");System.out.println(s);  //Happy happy New Year! 你好 2023!s.replace(6, 11, "new");  //左闭右开,下标0开始System.out.println(s);  //Happy new New Year! 你好 2023!s.delete(5, 9);System.out.println(s);  //Happy New Year! 你好 2023!s.reverse();  //翻转System.out.println(s);  //!3202 好你 !raeY weN yppaHs.setCharAt(1, '2');System.out.println(s);  //!2202 好你 !raeY weN yppaHString str=s.toString();  //StringBuffer转String(toString方法)System.out.println(str);  //!2202 好你 !raeY weN yppaHSystem.out.println(s.length());  //24,返回长度,和String一样}
}

二、StringBuilder类

1、概述

StringBuilder 类是 JDK 1.5 新增的类,它也代表可变字符串对象。实际上,StringBuilder 和 StringBuffer 功能基本相似,方法也差不多。不同的是,StringBuffer 是线程安全的,而 StringBuilder 则没有实现线程安全功能,所以性能略高

通常情况下,如需创建一个内容可变的字符串对象,应优先考虑使用 StringBuilder 类。

2、创建StringBuilder类对象

2.1 三种方式

1)StringBuilder 构造一个空的字符串缓冲区,并初始化为 16 个字符的容量。
2)StringBuilder(int length) 创建一个空的字符串缓冲区,并初始化为指定长度 length 的容量。
3)StringBuilder(String str) 创建一个字符串缓冲区,并将其内容初始化为指定的字符串内容 str,字符串缓冲区的初始容量为 16 加上字符串 str 的长度。

2.2 案例

理解如下案例即可

public class StringBuilderTest {public static void main(String[] args){// 定义一个空的字符串缓冲区,含有16个字符的容量StringBuilder str1 = new StringBuilder();// 定义一个含有10个字符容量的字符串缓冲区StringBuilder str2 = new StringBuilder(10);// 定义一个含有(16+4)的字符串缓冲区,"青春无悔"为4个字符StringBuilder str3 = new StringBuilder("青春无悔");/**输出字符串的容量大小*capacity()方法返回字符串的容量大小*/System.out.println(str1.capacity());    // 输出 16System.out.println(str2.capacity());    // 输出 10System.out.println(str3.capacity());    // 输出 20}
}

3、String和StringBuilder的相互转换

直接看案例

public class StringBuilderTest {public static void main(String[] args){String s = "abc";  //String转StringBuilderStringBuilder s1= new StringBuilder(s);System.out.println(s1);  //abcStringBuilder str=new StringBuilder("javaee");String str1=str.toString();  //StringBuffer转String(toString方法)System.out.println(str1);  //javaeeSystem.out.println(s1.getClass());  //class java.lang.StringBuilderSystem.out.println(str1.getClass());  //class java.lang.String}
}

注:可用getClass()方法判断变量类型。

4、StringBuilder类常用方法

常用的有append、delete、insert、replace、reverse、toString、setCharAt(修改指定位置index处的字符)等方法,其他方法和String类似,可自行对照来看。直接看懂以下案例即可

public class StringBuilderDemo1 {public static void main(String[] args){StringBuilder s=new StringBuilder("zhang san 2023");s.append(" hello");  //zhang san 2023 helloSystem.out.println(s);s.insert(6,"xiao ");System.out.println(s);  //zhang xiao san 2023 hellos.replace(6,10,"da");System.out.println(s);  //zhang da san 2023 hellos.delete(6,9);System.out.println(s);  //zhang san 2023 hellos.reverse();System.out.println(s);  //olleh 3202 nas gnahzs.setCharAt(4,'H');System.out.println(s);  //olleH 3202 nas gnahzString str=s.toString();  //StringBuilder 转 StringSystem.out.println(str);  //olleH 3202 nas gnahzSystem.out.println(s.getClass());  //判断变量s的类型,class java.lang.StringBuilderSystem.out.println(str.getClass());  //判断变量str的类型,class java.lang.StringSystem.out.println(s.length());  //20}
}

通过以上可以看出,StringBuilder和StringBuffer功能很相似,在对象创建和常用方法上基本都相同,所以在学习和记忆时侧重记住二者不同的地方即可。

5、String/StringBuffer/StringBuilder小结

总结一下三者之间的一些联系与区别。

5.1 背景及功能重述

1)String

String 是 Java 中基础且重要的类,被声明为 final class,是不可变字符串。因为它的不可变性,所以拼接字符串时候会产生很多无用的中间对象,如果频繁的进行这样的操作对性能有所影响。

2)StringBuffer

StringBuffer 就是为了解决大量拼接字符串时产生很多中间对象问题而提供的一个类。它提供了 append 和 add 方法,可以将字符串添加到已有序列的末尾或指定位置,它的本质是一个线程安全的可修改的字符序列。

3)StringBuilder

很多情况下字符串拼接操作不需要线程安全。StringBuilder 是 JDK1.5 发布的,它和 StringBuffer 本质上没什么区别,就是去掉了保证线程安全的那部分,减少了开销

5.2 线程安全

StringBuffer:线程安全

StringBuilder:线程不安全

5.3 速度

一般情况下,速度从快到慢为 StringBuilder > StringBuffer > String

从效率和性能角度出发,如果不考虑线程安全的话,优先推荐使用StringBuilder

5.4 使用环境

操作少量的数据使用 String。

单线程操作大量数据使用 StringBuilder。

多线程操作大量数据使用 StringBuffer。

三、StringJoiner类

1、概述

StringJoiner是Java8新出的一个类,作用是在构造字符串时可以自动添加前缀、后缀及分隔符,无需实现添加字符的逻辑。StringJoiner是通过StringBuilder进行封装实现的,性能和StringBuilder差不多,也是非线程安全的。

方法选择:简单的字符串拼接,直接使用”+”。for循环中进行字符串拼接,考虑StringBuilder和StringBuffer。通过一个List进行字符串拼接,考虑StringJoiner。方法不固定,根据情况自由选择。

2、StringJoiner构造方法

1)两种如下

StringJoiner(CharSequence delimiter, CharSequence prefix, CharSequence suffix)  //分隔符,前缀,后缀
StringJoiner(CharSequence delimiter)    //只有分隔符

2)案例

//前后缀拼接
import java.util.StringJoiner;  //必须先导包才能用
public class StringJoinerDemo {public static void main(String[] args) {String[] names={"zhangsan","lishi","wangwu"};StringJoiner sj=new StringJoiner(", ");  //只有分隔符的构造方法StringJoiner sj1=new StringJoiner(", ","[","]");  //含分隔符,前缀,后缀的构造方法StringJoiner sj2 = new StringJoiner("\", \"", "[\"", "\"]"); //转义,显示""for(String name:names){sj.add(name);sj1.add(name);sj2.add(name);}System.out.println(sj);  //    zhangsan, lishi, wangwuSystem.out.println(sj1); //    [zhangsan, lishi, wangwu]System.out.println(sj2); //    ["zhangsan", "lishi", "wangwu"]}
}
//字符串拼接
import java.util.StringJoiner;
public class StringJoinerDemo1 {public static void main(String[] args){StringJoiner sj=new StringJoiner(" ","[","]");sj.add("Hello");sj.add("Java");sj.add("SE");System.out.println(sj);  //  [Hello Java SE]}
}

在不需要指定“开头”和“结尾”的时候,用String.join()更方便,如下

public class StringJoinerDemo1 {public static void main(String[] args){String[] names = {"Bob", "Alice", "Grace"};String join = String.join(". ", names);System.out.println(join); // Bob. Alice. GraceString str = String.join(", ", "hello", "world", "测试", "继续加", "无限加");System.out.println(str); // hello, world, 测试, 继续加, 无限加}
}

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

CLion 2023:专注于C和C++编程的智能IDE mac/win版

JetBrains CLion 2023是一款专为C和C开发者设计的集成开发环境(IDE),它集成了许多先进的功能,旨在提高开发效率和生产力。 CLion 2023软件获取 CLion 2023的智能代码编辑器提供了丰富的代码补全和提示功能,使您能够更…

❤ hexo主题+Gitee搭建个人博客

Hexo的基本使用 1. ​认识 官网 官网地址:https://hexo.io/zh-cn/ 介绍 Hexo是一个快速、简洁且高效的博客框架。Hexo 使用 Markdown(或其他渲染引擎)解析文章,在几秒内,即可利用靓丽的主题生成静态网页。即把用…

在 Jupyter Notebook 中查看所使用的 Python 版本和 Python 解释器路径

🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 我们在做 Python 开发时,有时在我们的服务器上可能安装了多个 Python 版本。 使用 conda info --envs 可以列出所有的 conda 环境。当在 Linux 服务器上使用 which python 命令时&#xff0…

问题慢慢解决-通过android emulator调试android kernel-内核条件断点遇到的问题和临时解决方案

起因 在摸索到这个方案之后,mac m1调试aarch64 android kernel最终方案,就准备调试内核了,预备下断点的地方是 b binder_poll b ep_ptable_queue_proc b remove_wait_queue但是由于是android系统,上面三个函数会被频繁的触发&am…

基于Redis限流(固定窗口、滑动窗口、漏桶、令牌桶)(肝货!!!)

近期redis复习的比较多,在限流这方面发现好像之前理解的限流算法有问题,索性花了一天“带薪摸鱼”时间肝了一天,有问题可以评论区探讨。 废话不多说,正片开始 目录 Maven固定窗口滑动窗口算法漏桶算法令牌桶算法 Maven 有些不用的…

85、字符串操作的优化

上一节介绍了在模型的推理优化过程中,动态内存申请会带来额外的性能损失。 Python 语言在性能上之所以没有c++高效,有一部分原因就在于Python语言将内存的动态管理过程给封装起来了,我们作为 Python 语言的使用者是看不到这个过程的。 这一点有点类似于 c++ 标准库中的一些…

海格里斯HEGERLS四向穿梭车系统如何避免同区域多车作业产生的冲突障碍?

随着高新科技的不断迅速发展,仓储行业也在经历着前所未有的变革。其中,全自动四向穿梭车立体库无疑成为了近年来引人注目的创新,这种新型的仓储系统,以其高效率、自动化智能、灵活多样的特点,正在颠覆我们对传统仓储的…

网页数据的存储--存储为文本文件(TXT、JSON、CSV)

用解析器解析出数据后,接下来就是存储数据了。数据的存储有多种多样,其中最简单的一种是将数据直接保存为文本文件,如TXT、JSON、CSV等。这里就介绍将数据直接保存为文本文件。 目录 一、Python存储数据的方法 1、 文件读取 2、 文件写入…

2023年全球软件开发大会:前沿技术揭秘与未来趋势展望

2023年全球软件开发大会(QCon上海站2023)在科技圈掀起了新一轮的浪潮。 作为软件开发领域的顶级盛会,本次大会聚焦了当下最热门的技术话题,吸引了全球各地的开发者、架构师、技术领袖齐聚一堂,共同探讨软件开发的未来…

前端学习——vue学习

文章目录 1. < el-form> 属性 model、prop、rules2. v-bind 与 v-model3. v-if 与 v-show4. v-for 循环语句5. 计算属性 computed6. 监视属性 watch7. 下拉框 el-select、el-option8. 自定义事件9. async与await实现异步调用 1. < el-form> 属性 model、prop、rule…

【开源】SpringBoot框架开发婚恋交友网站

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 会员管理模块2.3 新闻管理模块2.4 相亲大会管理模块2.5 留言管理模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 会员信息表3.2.2 新闻表3.2.3 相亲大会表3.2.4 留言表 四、系统展示五、核心代码5.…

记录 | vscode go无法跳转问题解决

go 代码不能跳转 如果是windows下开发linux的一般要用 插件 Remote-ssh,就可以尽情的访问文件和路径了. 1.go代码跳转一方面是你要把所有的 vscode go 插件要安装上, 方法是ctrlshift p,输入Go:Install/Update ,回车之后,把这些都选中安装. 2020年之后的,都会采用go mod的…

自考《计算机网络原理》考前冲刺

常考选择填空 1、计算机网络的定义&#xff1a;计算机网络是互连的、自治的计算机的集合。 2、协议的定义&#xff1a;协议是网络通信实体之间在数据交换过程中需要遵循的规则或约定 3、协议的3个要素 (1) 语法&#xff1a;定义实体之间交换信息的格式与结构&#xff0c;或…

商品评论接口的应用

一、应用场景 商家调研自家产品的满意度及改进建议&#xff0c;B端商户想要铺货挑选商品&#xff0c;独立站运营商 二、公共参数 请求地址: https://api/item_review 三、请求参数 请求参数&#xff1a;num_iid600530677643&data&page1 参数说明&#xff1a;参数…

「JavaSE」String类3:字符串常量池

&#x1f387;个人主页&#xff1a;Ice_Sugar_7 &#x1f387;所属专栏&#xff1a;快来卷Java啦 &#x1f387;欢迎点赞收藏加关注哦&#xff01; 字符串常量池 &#x1f349;常量池&#x1f349;字符串常量池&#x1f349;intern 方法 &#x1f349;常量池 在Java程序中&…

Vue+SpringBoot打造音乐偏好度推荐系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、系统设计2.1 功能模块设计2.1.1 音乐档案模块2.1.2 我的喜好模块2.1.3 每日推荐模块2.1.4 通知公告模块 2.2 用例图设计2.3 实体类设计2.4 数据库设计 三、系统展示3.1 登录注册3.2 音乐档案模块3.3 音乐每日推荐模块3.4 通知公告模…

模型 KISS复盘法

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_总纲目录。重在提升认知。反思过去&#xff0c;不断进步。 1 KISS复盘法的应用 1.1 团队项目复盘 在一个团队项目结束后&#xff0c;团队成员可以使用KISS模型进行复盘&#xff0c;以总结经验教训并改进未来的工作…

linux服务器tomcat日志中文出现问号乱码

目录 一、场景二、排查三、原因四、解决 一、场景 tomcat日志的中文出现问号乱码 乱码示例 ??[377995738417729536]????????? ac??????????????message:二、排查 1、使用locale命令查看服务器当前使用的语言包 发现只用的语言包为utf-8&#xff0…

安全生产:AI视频智能分析网关V4如何应用在企业安全生产场景中?

随着科技的不断进步&#xff0c;视频智能分析技术在安全生产领域中的应用越来越广泛。这种技术通过计算机视觉和人工智能算法&#xff0c;可以对监控视频进行自动分析和处理&#xff0c;以实现多种功能&#xff0c;如目标检测、行为识别、异常预警等。今天我们以TSINGSEE青犀AI…

QPaint绘制自定义仪表盘组件02

网上视频抄的&#xff0c;用来自己看一下&#xff0c;看完就删掉 最终效果 ui&#xff0c;创建一个空的widget widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QPainter> #include <QTimer>QT_BEGIN_NAMESPACE namespace Ui { c…