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

【Java SE】 String、StringBuff和StringBuilder

🥰🥰🥰来都来了,不妨点个关注叭!

👉博客主页:欢迎各位大佬!👈

在这里插入图片描述

文章目录

  • 1. 字符串不可变性
    • 1.1 设计不可变
    • 1.2 修改字符串创建新对象
    • 1.3 为什么字符串不可变
    • 1.4 String类设计不可变的好处
    • 1.5 字符串的修改
  • 2. 如何查看反编码?
  • 3. StringBuff和StringBuilder
  • 4. 常考面试题

1. 字符串不可变性

String是一种不可变对象,即字符串中的内容是不可改变,它们的内容被创建好后,就不能被修改了!
为什么呢~

1.1 设计不可变

String类在设计时是不可改变,String类实现描述中已说明,以下来自JDK1.8String类的部分实现,如下图:
在这里插入图片描述
在这里插入图片描述
1)String类中的字符实际保存在内部维护的value字符数组中
2)String类被final修饰,表示String类不能被继承
3)value被final修饰,表示value自身的值不能改变,即不能引用其它字符数组,但其引用空间中的内容可以修改

1.2 修改字符串创建新对象

所有涉及到可能修改字符串内容的操作都是创建一个新对象,改变的是新对象
字符串的不可变性,字符串中的内容是不可改变,如修改了则是创建了新对象,改变的是新对象

1.3 为什么字符串不可变

误区
认为字符串不可变是因为其内部保存字符的数组value被final修饰了,因此不能改变
这种说法是错误的,不是因为String类自身被final修饰,也不是因为其内部value被final修饰而不能被修改
正解
final修饰类表明该类不想被继承,final修饰引用类型表明该引用变量不能引用其他对象,但其引用对象中的内容可以修改,“看起来String可变”,其实创建了新对象!!!

public class Test17 {public static void main(String[] args) {final int array[] = {1,2,3,4,5};array[0] = 100;System.out.println(Arrays.toString(array));array = new int[]{7,8,9};// 编译报错:Error:(15, 9) java: 无法为最终变量array分配值}
}

在这里插入图片描述
由上述代码进一步理解:可以修改对象引用的内容,但是无法更改引用的指向!!!

1.4 String类设计不可变的好处

为什么String类要设计成不可变的呢~
原因有以下3点:

  1. 从字符串对象池来说,方便实现字符串对象池,如果 String 可变,对象池就需要考虑写时拷贝的问题,变得复杂
  2. 从线程安全角度来说,不可变对象是线程安全的
  3. 从缓存角度来说,不可变对象更方便缓存 hash code, 作为 key 时可以更高效的保存到 HashMap中

1.5 字符串的修改

以下这种方式不推荐使用!!!
原因效率极低,中间创建好多临时对象,空间的占用

public class Test {public static void main(String[] args) {String s = "hello ";s += "world!";System.out.println(s);}
}

打印结果如下:
在这里插入图片描述
在上述代码过程中,查看反编码,具体过程分析如下图:
在这里插入图片描述
StringBuilder的构造方法如下:
在这里插入图片描述
可想而知,如果放在循环体中这样修改字符串,中间会创建好多临时变量
注意】尽量避免直接对String类型对象进行修改,String类不能修改,所有的修改都会创建新对象,效率非常低
String类进行修改时,效率非常慢,所以需要尽量避免对String的直接使用修改,如果要修改建议尽量使用StringBuffer或者StringBuilder,接下来StringBuffer和StringBuilder闪亮登场!

2. 如何查看反编码?

上面的反编码是如何进行查看的呢?下面是保姆级教程!!!
步骤
1)首先运行该程序!!!
在这里插入图片描述
2)找到文件所在位置
在这里插入图片描述
3)找到字节码文件
进入到这个界面,我们需要找到.class文件,即字节码文件
在这里插入图片描述
在这里插入图片描述
4 )输入cmd
在这里插入图片描述
5)输入 javap -c Test15
在这里插入图片描述
注意事项】javap -c Test15中Test15是该程序的类名,请输入你自己的类名哦~

3. StringBuff和StringBuilder

由于String的不可更改特性,为方便字符串的修改,Java中又提供StringBuilder和StringBuffer类这两大类,这两个类大部分功能是相同的
这里介绍 StringBuilder和StringBuff常用的一些方法:
在这里插入图片描述
其它方法需要用到可参阅Java在线文档
以下为上述方法的具体使用,更深入了解其方法~

public class Test {public static void main(String[] args) {StringBuilder sb1 = new StringBuilder("hello");StringBuilder sb2 = sb1;//append追加即尾插(字符、字符串、整形数字)sb1.append(' ');                  //hellosb1.append("world");              //hello worldsb1.append(1);                    //hello world1System.out.println(sb1);          //hello world1System.out.println(sb1 == sb2);   //trueSystem.out.println(sb1.length());    //获取字符串的有效长度12System.out.println(sb1.capacity());  //获取底层数组的总大小sb1.setCharAt(0, 'H');     //设置任意位置的字符 Hello world1sb1.insert(0, "Hello world!!!");         //Hello world!!!Hello world1System.out.println(sb1);System.out.println(sb1.indexOf("Hello"));          //获取Hello第一次出现的位置System.out.println(sb1.lastIndexOf("hello"));  	   //获取hello最后一次出现的位置sb1.deleteCharAt(0);                               //删除首字符sb1.delete(0,5);                                   //删除[0, 5)范围内的字符String str = sb1.substring(0, 5);                  //截取[0, 5)区间中的字符以String的方式返回System.out.println(str);sb1.reverse();                      //字符串逆转str = sb1.toString();               //将StringBuffer以String的方式返回System.out.println(str);}
}

在很多题目中,StringBuilde.append()方法经常使用到,应用于那些经常要修改的字符串中,还是相当方便哒~
注意事项
String和StringBuilder类不能直接转换。如果想互相转换,采用如下原则:

String—>StringBuilder: 1)利用StringBuilder的构造方法 2) append()方法
StringBuilder—>String: 调用toString()方法

4. 常考面试题

String、StringBuffer、StringBuilder的区别

  1. 内容上,String的内容不可修改,StringBuffer与StringBuilder的内容可以修改
  2. 功能上,StringBuffer与StringBuilder大部分功能是相似的
  3. 线程安全上,StringBuffer采用同步处理,属于线程安全操作;而StringBuilder未采用同步处理,属于线程不安全操作

解释说明
对线程安全来说,StringBuffer线程安全,可以在多线程下使用,StringBuilder线程不安全在单线程下使用,那么都用StringBuffer不就好了嘛~不需要考虑线程安全问题了
不行!!!会浪费很多资源,加锁和释放锁都会浪费资源!
💛💛💛本期内容回顾💛💛💛
在这里插入图片描述
✨✨✨本期内容到此结束啦~

相关文章:

【Java SE】 String、StringBuff和StringBuilder

🥰🥰🥰来都来了,不妨点个关注叭! 👉博客主页:欢迎各位大佬!👈 文章目录 1. 字符串不可变性1.1 设计不可变1.2 修改字符串创建新对象1.3 为什么字符串不可变1.4 String类设计不可变的…...

产品经理-需求分析(三)

1. 需求分析 从业务的需要出发,确定业务目的和目标,将业务需求转为产品需求 1.1 业务需求 业务需求 业务动机 业务目标 就是最根本的动机和目标成果,通过这个需求解决特定的问题 1.2 产品需求 产品需求 解决方案 产品结构 产品流程…...

Linux 编译器gcc/g++使用

gcc/g同理 编译器运行过程 1. 预处理(进行宏替换) gcc -E a.c -o a.i 预处理后还是c语言 -E 只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面 告诉gcc,从现在开始进行程序的翻译,将预处理工作做完停下 2. 编译&#x…...

adam优化器计算过程(tensorflow)

一、adam原理 原理 应用 优点 缺点 二、手动实现 一步一步计算 三、使用tensorflow api实现 api使用 四、一个具体的深度学习的例子...

【数据结构与算法 | 链表篇】力扣876

1. 力扣876 : 链表的中间节点 (1). 题 给你单链表的头结点 head ,请你找出并返回链表的中间结点。 如果有两个中间结点,则返回第二个中间结点。 示例 1: 输入:head [1,2,3,4,5] 输出:[3,4,5] 解释:链表…...

kubeadm引导欧拉系统高可用的K8S1.28.X

文章目录 一. 核心组件架构二. 有状态与无状态应用三. 资源对象3.1 规约与状态3.2 资源的分类-元数据,集群,命名空间3.2.1 元数据3.2.2 集群资源 3.3 命名空间级3.3.1 pod3.3.2 pod-副本集3.3.3 pod-控制器 四. Kubeadm安装k8s集群4.1 初始操作4.2 ~~所有节点安装Docker&#x…...

【信息学奥赛】字典的键和值对换

【信息学奥赛】字典的键和值对换 💖The Begin💖点点关注,收藏不迷路💖 输入一个字典,要求将该字典的键和值对换。(注意,字典中有键的值是重复的) 输入: 一行&#xff0…...

使用Django框架搭建Web应用

文章目录 简介安装Django创建一个Django项目创建一个Django应用编写视图配置URL运行开发服务器总结与拓展数据库集成管理后台表单处理模板引擎安全性 简介 Django 是一款基于 Python 语言的开源 Web 应用框架,采用了 MVC(模型-视图-控制器)设…...

我用Mybatis的方式封装了OLAP查询!

背景 相信做数据平台的朋友对OLAP并不陌生,主流的OLAP引擎有Clickhouse,Impala,Starrocks…以及公司二开的OLAP平台,本次要说的OLAP属于最后一种。 最近在做一个BI项目,业务背景很简单,就是一个数据展示平…...

golang rune类型解析,与byte,string对比,以及应用

Golang中的rune类型是一个32位的整数类型(int32),它是用来表示Unicode码点的。rune类型的值可以是任何合法的Unicode码点,它通常用来处理字符串中的单个字符。 在Golang中,字符常量使用单引号来表示,例如 a。使用单引号表示的字符…...

重学java 51.Collections集合工具类、泛型

"我已不在地坛&#xff0c;地坛在我" —— 《想念地坛》 24.5.28 一、Collections集合工具类 1.概述:集合工具类 2.特点: a.构造私有 b.方法都是静态的 3.使用:类名直接调用 4.方法: static <T> boolean addAll(collection<? super T>c,T... el…...

多语言印度红绿灯系统源码带三级分销代理功能

前端为2套UI&#xff0c;一套是html写的&#xff0c;一套是编译后的前端 后台功能很完善&#xff0c;带预设、首充返佣、三级分销机制、代理功能。 东西很简单&#xff0c;首页就是红绿灯的下注页面&#xff0c;玩法虽然单一&#xff0c;好在不残缺可以正常跑。...

HTML拆分与共享方式——多HTML组合技术

作者:私语茶馆 1.应用场景 如果是一个产品级的Web项目,往往非常多的页面部分是重复的(为保持风格一致),每个HTML页面将这些重复部分重新写一次,既带来极大的工作量,也造成后续修改不便。 因此会考虑到将一个HTML的不同部分拆分为多个HTML页面,利用类似Include方式包含…...

K8s集群之 存储卷 PV PVC

目录 默写 1 如何将pod创建在指定的Node节点上 2 污点的种类(在node上设置) 一 挂载存储​​​​​​​ 1 emptyDir存储卷 2 hostPath存储卷 ①在 node01 节点上创建挂载目录 ② 在 node02 节点上创建挂载目录 ③ 创建 Pod 资源 ④ 在master上检测一下&#xff1a;…...

“腾讯云 AI 代码助手”体验

一、“腾讯云 AI 代码助手”体验 1、注册账号并进行实名认证 2、进入开发环境 3、体验javascript简单函数 代码如下&#xff1a; //请写一个两个日期计算的函数 function dateDiff(date1, date2) {return date2.getTime() - date1.getTime(); } var date1 new Date("2…...

Django入门全攻略:从零搭建你的第一个Web项目

系列文章目录 努力ing Django入门全攻略&#xff1a;从零搭建你的第一个Web项目努力ing… 文章目录 系列文章目录前言一、Django1.0 框架介绍1.1 Django安装1.2 Django项目创建1.3 目录介绍 二、子应用2.1 子应用创建2.2 目录结构2.3 子应用注册2.4 子应用视图逻辑2.4.1 编写视…...

AI大模型日报#0529:杨红霞创业入局“端侧模型”、Ilya左膀右臂被Claude团队挖走

导读&#xff1a;AI大模型日报&#xff0c;爬虫LLM自动生成&#xff0c;一文览尽每日AI大模型要点资讯&#xff01;目前采用“文心一言”&#xff08;ERNIE 4.0&#xff09;、“零一万物”&#xff08;Yi-34B&#xff09;生成了今日要点以及每条资讯的摘要。欢迎阅读&#xff0…...

达梦数据库

达梦数据库 达梦Docker部署 达梦Docker部署 1、下载链接 https://pan.baidu.com/s/1RI3Lg0ppRhCgUsThjWV6zQ?pwdjc62 2、docker启动命令 docker run -d -p 5236:5236 \ --restartalways \ --name dm8 \ -e LD_LIBRARY_PATH/app/dm8/bin \ -e LENGTH_IN_CHAR1 \ -e CASE_SENS…...

什么是Axios

2024年5月23日&#xff0c;周四上午 Axios 是一个基于Promise的HTTP客户端&#xff0c;用于浏览器和node.js环境。它提供了一个简单易用的API来发送HTTP请求&#xff0c;并支持Promise API&#xff0c;这使得异步请求变得容易处理。 Axios的一些主要特点包括&#xff1a; Pro…...

React 其他 Hooks

其他 Hooks useRef 可用于获取 DOM 元素 const ScrollRef useRef(null)ScrollRef.current useContext &#xff08;先回顾一下之前的 Context 知识&#xff0c;借用之前 ppt 和源码&#xff09; Hooks 中使用 useContext 来获取 context 的值 // 父组件创建 contextexpor…...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)

2025年能源电力系统与流体力学国际会议&#xff08;EPSFD 2025&#xff09;将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会&#xff0c;EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

&#x1f31f; 什么是 MCP&#xff1f; 模型控制协议 (MCP) 是一种创新的协议&#xff0c;旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议&#xff0c;它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1)&#xff1a;从基础到实战的深度解析-CSDN博客&#xff0c;但实际面试中&#xff0c;企业更关注候选人对复杂场景的应对能力&#xff08;如多设备并发扫描、低功耗与高发现率的平衡&#xff09;和前沿技术的…...

Typeerror: cannot read properties of undefined (reading ‘XXX‘)

最近需要在离线机器上运行软件&#xff0c;所以得把软件用docker打包起来&#xff0c;大部分功能都没问题&#xff0c;出了一个奇怪的事情。同样的代码&#xff0c;在本机上用vscode可以运行起来&#xff0c;但是打包之后在docker里出现了问题。使用的是dialog组件&#xff0c;…...

GitFlow 工作模式(详解)

今天再学项目的过程中遇到使用gitflow模式管理代码&#xff0c;因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存&#xff0c;无论是github还是gittee&#xff0c;都是一种基于git去保存代码的形式&#xff0c;这样保存代码…...

在 Spring Boot 项目里,MYSQL中json类型字段使用

前言&#xff1a; 因为程序特殊需求导致&#xff0c;需要mysql数据库存储json类型数据&#xff0c;因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...

DBLP数据库是什么?

DBLP&#xff08;Digital Bibliography & Library Project&#xff09;Computer Science Bibliography是全球著名的计算机科学出版物的开放书目数据库。DBLP所收录的期刊和会议论文质量较高&#xff0c;数据库文献更新速度很快&#xff0c;很好地反映了国际计算机科学学术研…...

【UE5 C++】通过文件对话框获取选择文件的路径

目录 效果 步骤 源码 效果 步骤 1. 在“xxx.Build.cs”中添加需要使用的模块 &#xff0c;这里主要使用“DesktopPlatform”模块 2. 添加后闭UE编辑器&#xff0c;右键点击 .uproject 文件&#xff0c;选择 "Generate Visual Studio project files"&#xff0c;重…...

02.运算符

目录 什么是运算符 算术运算符 1.基本四则运算符 2.增量运算符 3.自增/自减运算符 关系运算符 逻辑运算符 &&&#xff1a;逻辑与 ||&#xff1a;逻辑或 &#xff01;&#xff1a;逻辑非 短路求值 位运算符 按位与&&#xff1a; 按位或 | 按位取反~ …...