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://www.mzph.cn/news/699673.shtml

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

相关文章

RSA加密原理

2024.2.23 密钥对的生成过程 1、随机找两个质数 P 和 Q ,P 与 Q 越大,越安全 本例取 P 67 ,Q 71 计算他们的乘积 N P * Q 4757 转化为二进为 1001010010101,该加密算法即为 13 位,实际使用中的算法是往往是 …

前瞻性规划:解决数据中心机房通用性问题

随着技术的快速发展,数据中心机房的建设面临着不断变化的挑战。在机房规划和设计阶段,缺乏对用户需求的深入分析和对未来发展趋势的考量,往往会导致机房通用性不足,从而影响其长期使用效率和稳定性。本文将探讨数据中心机房建设中…

Ansible概述和常用模块

目录 一、ansible概述 (一)基础知识 (二)特性 二、部署ansible (一)管理端安装 (二)ansible 目录结构 (三)配置主机清单 (四)…

Leetcode2583. 二叉树中的第 K 大层和

Every day a Leetcode 题目来源:2583. 二叉树中的第 K 大层和 解法1:层序遍历 排序 先使用层序遍历计算出树的每一层的节点值的和,保存在数组 levelSum 中。然后将数组进行排序,返回第 k 大的值。需要考虑数组长度小于 k 的边…

【Linux】 yum命令使用

yum命令 yum( Yellow dog Updater, Modified) 是一个在 Fedora、CentOS 及其它一些基于 RPM 的 Linux 发行版中使用的包管理器。它允许用户自动安装、更新、配置和删除软件包。yum 由 Python 写成,基于 RPM(Red Hat Package Mana…

EasyRecovery2024永久免费版手机数据恢复软件功能全面介绍

一、功能概述 EasyRecovery手机数据恢复软件是一款专为移动设备设计的数据恢复工具。它能够有效地从智能手机、平板电脑等移动设备中恢复因各种原因丢失的数据,包括但不限于误删除、格式化、系统崩溃、病毒感染等。 EasyRecovery-mac最新版本下载:https://wm.maked…

【Java程序设计】【C00267】基于Springboot的在线考试系统(有论文)

基于Springboot的在线考试系统(有论文) 项目简介项目获取开发环境项目技术运行截图 项目简介 本系统是基于Springboot的在线考试系统;本系统主要分为管理员、教师和学生三种角色; 管理员登录系统后,可以对首页&#x…

悄悄话花费的时间(C语言)【二叉树各结点统计求和】

题目描述 给定一个二叉树,每个节点上站着一个人,节点数字表示父节点到该节点传递悄悄话需要花费的时间。 初始时,根节点所在位置的人有一个悄悄话想要传递给其他人,求二叉树所有节点上的人都接收到悄悄话花费的时间。 输入描述 …

前端数据可视化:ECharts使用

可视化介绍 ​  ​  应对现在数据可视化的趋势,越来越多企业需要在很多场景(营销数据,生产数据,用户数据)下使用,可视化图表来展示体现数据,让数据更加直观,数据特点更加突出。   ​  数据可视化主要目…

openssl 生成nginx自签名的证书

1、命令介绍 openssl req命令主要的功能有,生成证书请求文件, 查看验证证书请求文件,还有就是生成自签名证书。 主要参数 主要命令选项: -new :说明生成证书请求文件 -x509 :说明生成自签名证书 -key :指定已…

【大数据】Flink 内存管理(一):设置 Flink 进程内存

Flink 内存管理(一):设置 Flink 进程内存 1.配置 Total Memory2.JVM 参数3.根据比例限制的组件(Capped Fractionated Components) Apache Flink 通过严格控制各种组件的内存使用,在 JVM 上提供高效的工作负…

全面解析企业财务报表系列之四:财务报表的真实性和可靠性

全面解析企业财务报表系列之四:财务报表的真实性和可靠性 一、什么是会计方法二、选择会计方法三、会计方法的重要性四、会计报表常用的造假手段五、财务报表经常被遗漏的重要事件六、财务报告造假的资信敏感性七、财务报告审计的重要性八、审计报告 一、什么是会计…

微信小程序商城-兜点零食

微信小程序商城 【微信小程序商城-兜点零食】 小程序采用uniappvue开发,后台djangopython开发,模块化方便二次开发 1、具备商城完整功能,包括在线下单、支付、订单跟踪、物流查询; 2、具备社交化分享功能,为用户提供分…

2024年数学建模美赛详细总结以及经验分享

前言: 本文记录与二零二四年二月六日,正好今天是数学建模结束,打算写篇文章记录一下整个过程,以及一些感受、还有经验分享。记录这个过程的原因就是我在赛前,在博客上找了很久,也没有像我这么类似记…

基于事件触发机制的孤岛微电网二次电压与频率协同控制MATLAB仿真模型

微❤关注“电气仔推送”获得资料(专享优惠) 本模型质量非常高,运行效果完美。本模型为4机并联孤岛系统,在下垂控制的基础上加入二次控制,二次电压与频率协同控制策略利用事件触发的方法来减少控制器的更新次数。该方法…

easyui 手风琴Accordion 面板的高度设置

今天接到一个新的小需求,如下图,当预算表单只有一个时,要求不显示预算表单这块的内容。 考虑到页面创建时用到了表单的回调和点击方法,所以不能单纯的移除,移除右侧表格的创建会报错,所以只能隐藏。 隐藏…

Docusaurus框架——快速搭建markdown文档站点介绍sora

文章目录 ⭐前言⭐初始化项目💖 创建项目(react-js)💖 运行项目💖 目录文件💖 创建一个jsx页面💖 创建一个md文档💖 创建一个介绍sora的文档 ⭐总结⭐结束 ⭐前言 大家好&#xff0…

劫持已经存在的DLL

这里找到一个成功加载的 这里先把原来程序正常的dll改名为libEGL1.dll,然后将我们自己的dll改名为libEGL.dll 然后再重新执行程序,这里同样是弹出了窗口

QEMU源码全解析 —— virtio(20)

接前一篇文章: 上回书重点解析了virtio_pci_modern_probe函数。再来回顾一下其中相关的数据结构: struct virtio_pci_device struct virtio_pci_device的定义在Linux内核源码/drivers/virtio/virtio_pci_common.h中,如下: /* O…

centos7 docker 安装

1.卸载之前docker环境 sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docke…