JavaSE:StringBuilder和StringBuffer类

1、引言

在上一篇文章中,我们理解了字符串的常用方法,细心的同学大概已经发现,不管是将字符串中的字符转变为大写或小写,或是完成字符串的替换,又或是去除空白字符等等,只要涉及到字符串的修改,我们都是生成了一个新的字符串,而不是改变原有的字符串。

例如(toLowerCase方法的源码,返回新的字符串对象):

这是因为String类的对象是不可以被修改的(字符串具有不可变性)。关于字符串为什么不可以被修改,答案就在下面的文章中~

2、字符串为什么具有不可变性

2.1 String类在源码中的设计

2.1.1 String类被final所修饰

为什么不可被修改呢?我们先来观察String类的源码:

我们可以看到String类被final所修饰,但是这并不是字符串不可变的原因,因为当类被final修饰时,只能说明这个类不能被继承,也就是说String类不可被继承,而不是不可变。

2.1.2 value被final所修饰

我们继续往下看,

我们又发现,value数组也被final修饰了,我们知道,String类的value数组才真正存储了字符串的内容,到这里,有的同学就开始激动了,就说:"value数组被final修饰了,变成了常量,常量不可变,所以字符串就具有不可变性!!!"。

但事实并不是这样,因为数组是一个引用类型,当引用类型被final修饰,只能说明当前引用变量的指向不能改变,而并不是不能修改它所指向的内容,我们来观察以下代码:

我们发现,当数组被final修饰后,我们可以改变它的内容,但是不能改变它的指向,也就是说final修饰value数组并不是字符串不可变的原因。(很多同学都会在这里产生误解)

2.1.3 value数组被private修饰封装

其实这点才是字符串不可变的真正原因,value数组被封装在了String类当中,没有提供任何的get和set方法,无法获取到字符串,当然也不可能被修改。

2.2 总结

1.当一个类被final修饰,说明这个类不能被继承。也就是说,String类被final修饰不是字符串不可变的原因。

2.当一个引用类型被final所修饰,说明这个引用的指向不能改变,但是可以修改这个引用所指向的内容。也就是说,value被final修饰不是字符串不可变的原因。

3.value被private修饰,被封装起来才是字符串不可变的真正原因。

3、字符串的修改

3.1 使用"+"对字符串拼接

我们已经理解了字符串为什么不可变,也知道了字符串的修改实质上会再创建一个新对象,

因此,我们每使用一次"+"来完成字符串的拼接(以及对字符串进行修改)实质上就是创建了一个新的String类对象:

而每次都要创建新对象,会占用大量的内存空间,效率非常低下,所以我们不推荐这样来完成字符串的拼接,为了提高效率,我们使用StringBuilder和StringBuffer类来完成对字符串的修改。

3.2 StringBuilder和StringBuffer类

StringBuilder和StringBuffer的功能大部分是相同,我们这里就以StringBuilder来讲。

3.2.1 append方法完成拼接

我们可以通过append来完成字符串的拼接(拼接在尾部,相当于String的"+"):

我们可以通过append来拼接多种类型,且返回值都是this(说明在原来的串上进行的修改,不会产生新的对象):

拼接完成后,我们可以调用StringBuilder中重写的toString方法,使用String类型来接收生成的字符串:

这样,可以减少额外对象的生成,大大的提高了效率!

3.2.2 StringBuilder和StringBuffer中的字符串修改方法

我们发现,在这两大类中,提供了能够修改字符串的方法,很方便的供我们使用。

例如reverse方法:

我们可以很轻松的在原来的字符串上完成字符的逆置。

例如insert方法:

我们可以在指定下标处完成插入。

注:这些方法都是在原本的字符串上进行的修改,不会生成新的对象,效率很高。

4、String、StringBuilder、StringBuffer的区别

1.String的内容不可被修改,StringBuilder和StringBuffer的内容可以被修改。

2.StringBuilder和StringBuffer的功能大体相同。

3.StringBuffer采用同步处理,属于线程安全操作;而StringBuilder未采用同步处理,属于线程不安全操作。(学习中,后面再说~)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

玩转STM32-I2C通信协议(详细-慢工出细活)

文章目录 一、I2C总线原理(掌握)1.1 硬件构成1.2 传输位1.3数据传输格式 二、STM32的I2C特性和结构三、STM32的I2C通信实现(硬件实现方式)3.1 I2C主模式 四、应用实例 一、I2C总线原理(掌握) 1.1 硬件构成…

软件测试经理工作日常随记【6】-利用python连接禅道数据库并自动统计bug数据到钉钉群

测试管理_利用python连接禅道数据库并统计bug数据到钉钉 这篇不多赘述,直接上代码文件。 另文章基础参考博文:参考博文 加以我自己的需求优化而成。 统计的前提 以下代码统计的前提是禅道的提bug流程应规范化 bug未解决不删除bug未关闭不删除 db_…

解读makefile中$(patsubst pattern,replacement,text)

在 Makefile 中,$(patsubst pattern,replacement,text) 是一个用于模式替换的函数,它可以将文本中符合指定模式的部分替换为指定的字符串。这个函数通常用于对文件名或路径进行模式匹配和替换,非常适合在 Makefile 中进行文件名的转换操作。 …

计算机毕业设计python+spark天气预测 天气可视化 天气大数据 空气质量检测 空气质量分析 气象大数据 气象分析 大数据毕业设计 大数据毕设

摘 要 近些年大数据人工智能等技术发展迅速,我国工业正努力从“制造”迈向“智造”实现新跨越。神经网络(NeuronNetwork)是一种计算模型,通过大量数据的学习,来发现数据之间的模式和规律,模仿人脑神经元的工作方式。随着算力的提…

【深度学习】Transformer梳理

零、前言 对于transformer,网上的教程使用记号、术语不一 。 最关键的一点,网上各种图的简化程度不一 (画个图怎么能这么偷懒) ,所以我打算自己手画一次图。 看到的最和善(但是不是那么靠谱,我…

使用 Spring HATEOAS 开发 REST 服务-浅显的理解

随笔,简单理解 一、restful是什么 1、第一层次(Level 0)的 Web 服务只是使用 HTTP 作为传输方式,实际上只是远程方法调用(RPC)的一种具体形式。 SOAP 和 XML-RPC 都属于此类 2、第二层次(Lev…

linux学习(六)

1.网络管理 (1)查看 ifconfig: root用户可以查看网卡状态, 普通用户: /sbin/ifconfig(需要加上命令的完整路径) (2)修改网络配置 通过命令修改网络配置 设置网卡的ip地址;禁用网卡和启用网卡了。 添加网关: (3)网络故障查询 ①ping 检测当前主机和目标主机是…

线段树例题

目录 1.Sequence 2.Peach Conference 3.Permutation Subsequence 1.Sequence 题目描述: Given an array a consisting of n integers, on which you are to perform m operations of two types. 1.Given two integers x,y, replace the number of index x with n…

Windows10(家庭版)中DockerDesktop(docker)的配置、安装、修改镜像源、使用

场景 Windows10中Docker的安装与遇到的那些坑: Windows10中Docker的安装与遇到的那些坑_在 docker.core.logging.httpclientexceptionintercept-CSDN博客 上面讲Docker Desktop在windows10非家庭版上的安装,如果是家庭版,则需要执行如下步骤。 注&am…

动态规划之买卖股票大集合

目录 引言 1.只能进行一次买卖股票(最多只能买一股股票) 2.可以进行多次股票买卖,且没有手续费(最多只能买一股股票) 3.可以进行多次股票买卖,但是有冷冻期,无手续费(最多只能买一…

Xunsearch:实现拼音搜索和中文分词功能

首先我们需要安装xunsearch扩展库,参考 1、设置分词器和拼音搜索功能 在创建Xunsearch对象后,可以设置相应的分词器和拼音搜索功能。以下代码示例演示了如何设置分词器和拼音搜索功能: $index $xunsearch->index; $index->setToken…

Cesium For Unity 在Unity中无法下载的问题

Unity 下载失败,提供百度网盘“com.cesium.unity-1.10.0.tgz”下载链接 链接:https://pan.baidu.com/s/1PybXQ8EvkRofOKD6rSN66g?pwd1234 提取码:1234 导入方法: 1.打开PackageManager;Window-PackageManager 2.在PackageMan…

Leetcode621. 任务调度器

Every day a Leetcode 题目来源:621. 任务调度器 类似题目:1953. 你可以工作的最大周数 解法1:贪心 本质上来说,我们需要构造一个尽量短的,相同元素间隔 > (n1) 的序列。 用一个数组 cnt 统计每个任务的次数。…

【论文阅读笔记】The Google File System

1 简介 Google File System (GFS) 是一个可扩展的分布式文件系统,专为快速增长的Google数据处理需求而设计。这篇论文发表于2003年,此前已在Google内部大规模应用。 GFS不仅追求性能、可伸缩性、可靠性和可用性等传统分布式文件系统的设计目标&#xf…

如何使用 Connector API 将数据提取到 Elasticsearch Serverless 中

作者:来自 Elastic Jedr Blaszyk Elasticsearch 支持一系列摄取方法。 其中之一是 Elastic Connectors,它将 SQL 数据库或 SharePoint Online 等外部数据源与 Elasticsearch 索引同步。 连接器对于在现有数据之上构建强大的搜索体验特别有用。 例如&…

新火种AI|警钟长鸣!教唆自杀,威胁人类,破坏生态,AI的“反攻”值得深思...

作者:小岩 编辑:彩云 在昨天的文章中,我们提到了谷歌的AI Overview竟然教唆情绪低迷的网友“从金门大桥跳下去”。很多人觉得,这只是AI 模型的一次错误判断,不会有人真的会因此而照做。但现实就是比小说电影中的桥段…

Linux shell编程学习笔记51: cat /proc/cpuinfo:查看CPU详细信息

0 前言 2024年的网络安全检查又开始了,对于使用基于Linux的国产电脑,我们可以编写一个脚本来收集系统的有关信息。对于中央处理器CPU比如,我们可以使用cat /proc/cpuinfo命令来收集中央处理器CPU的信息。 1. /proc/cpuinfo 保存了系统的cpu…

【学习心得】PyTorch的知识要点复习(持续更新)

PyTorch知识要点复习,目的是为了巩固PyTorch基础、快速回顾、深化理解PyTorch框架。这篇文章会持续更新。 一、本文的一些说明 知识点梳理:我将PyTorch的核心概念和高级技巧进行了系统化的整理,从基础的张量操作到复杂的模型构建与训练。这样…

拉普拉斯IPO:科技与产业深度融合,实现业务领域延展

我国拥有全球最具竞争优势的光伏产业链,基于降本增效的需求,光伏产业对于技术革新具有持续的需求。拉普拉斯新能源科技股份有限公司(以下简称“拉普拉斯”)凭借深厚的技术积累,以及对光伏产业深刻的理解,聚…

【数据结构】AVL树——平衡二叉搜索树

个人主页:东洛的克莱斯韦克-CSDN博客 祝福语:愿你拥抱自由的风 目录 二叉搜索树 AVL树概述 平衡因子 旋转情况分类 左单旋 右单旋 左右双旋 右左双旋 AVL树节点设计 AVL树设计 详解单旋 左单旋 右单旋 详解双旋 左右双旋 平衡因子情况如…