【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不就好了嘛~不需要考虑线程安全问题了
不行!!!会浪费很多资源,加锁和释放锁都会浪费资源!
💛💛💛本期内容回顾💛💛💛
在这里插入图片描述
✨✨✨本期内容到此结束啦~

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

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

相关文章

在Docker中使用GPU

一、安装nvidia-container-toolkit 总之一句话:nvidia-docker和nvidia-docker2,nvidia-container-runtime 已经被英伟达迭代了,可以认为nvidia-container-toolkit是nvidia-docker和nvidia-docker2, nvidia-container-runtime 的替…

Vue3项目练习详细步骤(第三部分:文章分类页面模块)

文章分类列表 主体结构 接口文档 文章分类列表查询接口数据绑定 Pinia状态管理库 axios请求拦截器 Pinia持久化插件-persist 未登录统一处理 添加文章分类 主体结构 接口文档 绑定请求数据 编辑文章分类 弹框结构 数据回显 接口文档 绑定请求数据 删除分类 …

前端中var、let 或 const区别

前端中var、let 或 const区别 一、前言1.var2.let3.const4.总结 一、前言 当涉及 JavaScript 中的变量声明时,开发人员通常会面临选择使用 var、let 或 const。虽然它们都可以用来声明变量,但在实际应用中,它们之间有一些重要的区别。接下来…

在window中使用HTTP服务器获取kali的文件

文章目录 一、在window中使用HTTP服务器获取kali的文件1、疑问2、执行条件3、成功读取 一、在window中使用HTTP服务器获取kali的文件 1、疑问 有时候kali上面有的文件想传入window但是发现不允许这样操作那怎么办呢?特别是在一些限制工具的比赛中想把kali的文件传…

数字化学校渠道的建造内容

数字化学校渠道的建造内容可以用阶段来区分: 1.网络硬件为主的建造 这一阶段首要重视的是学校网络的硬件基础建造,一起供给部分网络根本服务,与此一起,也进行部分信息使用内容的建造,如电子阅览室、归纳管理信息体系等…

Android 图片加载glide库 一次通关

前言 Glide是一个由Bumptech开发的开源图片加载库,专门用于Android平台。它被广泛应用于Android应用中,以简化图片加载过程,并提高性能和效率。 Glide能够快速加载图片,同时减少页面加载时间和内存消耗。Glide具有强大的缓存机制…

国产操作系统上apt命令详解 _ 统信 _ 麒麟 _ 中科方德

原文链接:国产操作系统上apt命令详解 | 统信 | 麒麟 | 中科方德 Hello,大家好啊!今天给大家带来一篇在国产操作系统上使用apt命令的详解文章。apt(Advanced Package Tool)是Debian及其衍生发行版(如统信UOS…

网络流量监控:解读网络性能的关键

目录 什么是网络流量监控? 网络流量监控的原理 网络流量监控的应用 AnaTraf网络流量分析仪简介 结语 在当今数字化时代,网络已成为人们日常生活和商业运营的核心。随着企业和个人对网络的依赖程度不断增加,确保网络稳定性和性能已成为至…

如何在JavaScript中检查字符串是否包含子字符串?

在JavaScript中检查一个字符串是否包含某个子字符串是一个常见任务。本文将介绍几种实现该功能的方法,包括传统方法和高级算法。 使用 indexOf() 方法 最基础和常见的方法是使用 indexOf() 方法。该方法返回字符串在另一个字符串中的起始位置,如果未找…

TPshop商城的保姆教程(windows)

提前准备 phpStudy下载:https://www.xp.cn/download.html 选择适合自己的版本下载 TPshop商城源文件下载链接: https://pan.baidu.com/s/143fLrxbwe9CTMCbyx7mXJQ?pwd6666 开始安装 安装完phpstudy后 以管理员的身份启动phpstudy.exe 选择合适自己…

2024年03月 Python(六级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,共50分) 第1题 以下选项中,创建类正确的是?() A: class test1: def prt(self): …… B: class Mg(): def__init__(na,ag): self.na=na C: class A(): def print(self): print(“Yes”) a=A() a.print() D…

【好书推荐,持续更新~~】

书籍推荐,持续更新~~ 1.《只是为了好玩: Linux之父林纳斯自传》-- Linus Torvalds, David Diamond Linux之父Linus Torvalds的自传,也是Linus唯一一本书。Linus以调侃的语气讲述了自己的成长经历,在他看来,一切都是为了好玩儿&am…

【Vue】v-bind属性绑定指令

作用:动态设置html的标签属性 比如:src、url、title 默认情况下是单向的 语法: v-bind:属性名"表达式"v-bind:可以简写成 > : 比如,有一个图片,它的 src 属性值,是一个图片地址。这个地址…

Android SDK下载安装(_指定版本)

安装完sdk,就可以直接使用adb命令了,如果想做app相关自动化测试,也是需要sdk环境依赖的 一、SDK下载 A:官网下载: 管内镜像网站(推荐):https://www.androiddevtools.cn/index.html 官网:htt…

2024-5-9——给植物浇水 II

2024-5-9 题目来源我的题解方法一 双指针 题目来源 力扣每日一题;题序:2105 我的题解 方法一 双指针 使用两个指针t1和t2记录Alice和Bob当前还未浇水的植物,使用变个变量cap1和cap2表示Alice和Bob当前剩余的水量。 两端同时浇水&#xff0…

渗透测试一些知识点

1、如果提示缺少参数,如{msg:params error},可尝使用字典模糊测试构造参数,进一步攻击。 2、程序溢出,int最大值为2147483647,可尝试使用该值进行整数溢出,观察现象。 3、403,404响…

如何使用MATLAB写测试(2)Negative Test

如何使用MATLAB写测试(2)Negative Test 原文:如何使用MATLAB写测试(2)Negative Test - 知乎 (zhihu.com) 上一篇请参见 如何使用MATLAB写测试(1) - 知乎专栏 上一篇中,我们的实习…

【YashanDB知识库】ODBC驱动类问题定位方法

【标题】ODBC驱动类问题定位方法 【需求分类】故障分析 【关键字】ODBC 【需求描述】由于我们的ODBC接口目前尚不完善,经常会遇见ODBC接口能力不足导致应用功能无法运行的问题,需要定位手段确定底层是哪个接口报错 【需求原因分析】方便一线数据库管…

【python】修改目标检测的txt标签(yolo)的类别ID映射

脚本功能: 针对目录下的所有yolo格式的txt标签文件,将class类别的id修改为指定id。 实际应用常见不多 代码 # -*- coding: utf-8 -*- # Time : 2023/9/11 10:58 # Author : CLW # FileName: change_txt_label.py # Software: PyCharmimport os 算法功…

markdown语法保存

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…