当前位置: 首页 > news >正文

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未采用同步处理,属于线程不安全操作。(学习中,后面再说~)

相关文章:

JavaSE:StringBuilder和StringBuffer类

1、引言 在上一篇文章中,我们理解了字符串的常用方法,细心的同学大概已经发现,不管是将字符串中的字符转变为大写或小写,或是完成字符串的替换,又或是去除空白字符等等,只要涉及到字符串的修改&#xff0c…...

C语言在线编程网站:探索编程的奥秘与深度

C语言在线编程网站:探索编程的奥秘与深度 在数字世界的浩瀚海洋中,编程已成为连接现实与虚拟的桥梁。而C语言,作为编程领域的经典之作,其深度与广度令无数探索者着迷。为了满足广大编程爱好者的需求,C语言在线编程网站…...

Android 之广播监听网络变化

网络状态变化监听帮助类 NetBroadcastReceiverHelper public class NetBroadcastReceiverHelper {private static final String TAG "NetBroadcastReceiverHelper";private static final String NET_CHANGE_ACTION "android.net.conn.CONNECTIVITY_CHANGE&qu…...

Hono 框架使用经验谈

Hono🔥是一个小型、快速并开源的 Serverless Web 框架,用 TypeScript 写就。它适用于任何JavaScript运行时:Cloudflare Workers,Fastly ComputeEdge,Deno,Bun,Vercel,Netlify&#x…...

mac 下配置mysql的全局环境变量

前言 如果你还没有安装mysql,请参考这篇文章手把手教你MAC本地数据库的安装与使用:mysql python (pymysql)【一】 - 知乎 正文 1.打开终端,输入命令”echo $SHELL“,显示当前的shell ⚠️本人使用的终端shell是zsh,如果你使用…...

小红书云原生 Kafka 技术剖析:分层存储与弹性伸缩

面对 Kafka 规模快速增长带来的成本、效率和稳定性挑战时,小红书大数据存储团队采取云原生架构实践:通过引入冷热数据分层存储、容器化技术以及自研的负载均衡服务「Balance Control」,成功实现了集群存储成本的显著降低、分钟级的集群弹性迁…...

Python实现解码二进制数据以匹配给定的C++结构体

要在Python中实现解码二进制数据以匹配给定的C结构体Ytest,你需要了解每个字段在结构体中的偏移量(由于结构体内存对齐,这些偏移量可能与字段的顺序和大小不完全对应)。不过,在没有指定内存对齐的情况下,我…...

实施阶段(2024年5月)

【项目活动1】斐波拉契数列第n项的值? 数学思想:第一项和第二项的值都为1,从第三项开始值为前两项的和。 方法一:迭代 迭代变量:f1和f2 迭代表达式:f1,f2f2,f1f2 计数器:i 迭代表达式运算…...

(delphi11最新学习资料) Object Pascal 学习笔记---第13章第3节 (弱引用是系统托管的 )

13.4.2 弱引用是系统托管的 ​ 弱引用的托管是一个非常重要的内容。换句话说,系统会在内存中保存一个弱引用列表,当对象被销毁时,系统会检查是否有任何弱引用指向该对象,如果有,系统会将实际引用赋值为 nil&#xff0…...

安装WordPress

第 1 步:下载并解压 wget https://wordpress.org/latest.tar.gz 然后使用以下命令提取包: tar -xzvf latest.tar.gz 第 2 步:创建数据库 比如数据库名称为wordpress,编码格式为 utf8mb4_general_ci 第 3 步:设置wp-con…...

【STL库源码剖析】list 简单实现

从此音尘各悄然 春山如黛草如烟 目录 list 的结点设计 list 的迭代器 list 的部分框架 迭代器的实现 容量相关相关函数 实现 insert 在指定位置插入 val 实现 push_back 在尾部进行插入 实现 erase 在指定位置删除 实现 pop_back 在尾部进行删除 实现 list 的头插、头删 实现…...

web前端框架设计第十一课-常用插件

web前端框架设计第十一课-常用插件 一.预习笔记 1.路由的基础使用 2.动态路由 3.嵌套路由 二.课堂笔记 三.课后回顾 –行动是治愈恐惧的良药,犹豫拖延将不断滋养恐惧...

Java基础-注解

注解本质是继承了Annotation接口的一个接口 首先,我们通过键值对的形式可以为注解属性赋值,像这样:Hello(value “hello”)。 接着,你用注解修饰某个元素,编译器将在编译期扫描每个类或者方…...

SpringCloud之SSO单点登录-基于Gateway和OAuth2的跨系统统一认证和鉴权详解

单点登录(SSO)是一种身份验证过程,允许用户通过一次登录访问多个系统。本文将深入解析单点登录的原理,并详细介绍如何在Spring Cloud环境中实现单点登录。通过具体的架构图和代码示例,我们将展示SSO的工作机制和优势&a…...

二分查找算法详讲(三种版本写法)原创

介绍: 二分查找算法(Binary Search)是一种在有序数组中查找目标元素的算法。 它的基本思想是通过将目标元素与数组的中间元素进行比较,从而将搜索范围缩小一半。 如果目标元素等于中间元素,则搜索结束;如果目标元素小…...

Git钩子(Hooks)之commit之前自动执行脚本

介绍 官方文档: 英文:https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks中文:https://git-scm.com/book/zh/v2/自定义-Git-Git-钩子 下面只复制了pre-commit部分文档,其他详见官方文档。 Git Hooks Like many other…...

nano机器人2:机械臂的视觉抓取

前言 参考链接: 【机械臂入门教程】机械臂视觉抓取从理论到实战 GRCNN 通过神经网络,先进行模型训练,在进行模型评估。 机械臂逆运动学求解 所有串联型6自由度机械臂均是可解的,但这种解通常只能通过数值解法得到,计算难度大&am…...

技术速递|宣布 Java on Azure 开发工具支持 Java on Azure Container Apps

作者:Jialuo Gan 排版:Alan Wang 在 Microsoft Build 2024 期间宣布,Azure Container Apps 现在可为 Java 开发人员提供丰富的操作功能。(详细内容请参见本博客)。 我们很高兴地与大家分享,Azure Toolkit for Intelli…...

随机森林算法实现分类

随机森林算法实现对编码后二进制数据的识别 1.直接先上代码! import numpy as np import pandas as pd from sklearn.model_selection import train_test_split, GridSearchCV from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import …...

Ubuntu卸载软件

在删除这些目录之前,你必须确定一个非常重要的事情:确认没有任何服务正在使用这些版本的 PHP。如果你删除了正在使用的 PHP 版本的扩展目录,那么依赖于这个版本的 PHP 的网站或服务可能会停止工作。 如果你确定某个版本的 PHP 没有在使用中&…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

React hook之useRef

React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API&#xff0c;查询的是单条数据&#xff0c;比如根据主键ID查询用户信息&#xff0c;sql如下&#xff1a; select id, name, age from user where id #{id}API默认返回的数据格式是多条的&#xff0c;如下&#xff1a; {&qu…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中&#xff0c;电磁频谱已成为继陆、海、空、天之后的 “第五维战场”&#xff0c;雷达作为电磁频谱领域的关键装备&#xff0c;其干扰与抗干扰能力的较量&#xff0c;直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器&#xff0c;凭借数字射…...

LabVIEW双光子成像系统技术

双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制&#xff0c;展现出显著的技术优势&#xff1a; 深层组织穿透能力&#xff1a;适用于活体组织深度成像 高分辨率观测性能&#xff1a;满足微观结构的精细研究需求 低光毒性特点&#xff1a;减少对样本的损伤…...

抽象类和接口(全)

一、抽象类 1.概念&#xff1a;如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象&#xff0c;这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法&#xff0c;包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中&#xff0c;⼀个类如果被 abs…...

阿里云Ubuntu 22.04 64位搭建Flask流程(亲测)

cd /home 进入home盘 安装虚拟环境&#xff1a; 1、安装virtualenv pip install virtualenv 2.创建新的虚拟环境&#xff1a; virtualenv myenv 3、激活虚拟环境&#xff08;激活环境可以在当前环境下安装包&#xff09; source myenv/bin/activate 此时&#xff0c;终端…...