【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(' ');                  //hello
            sb1.append("world");              //hello world
            sb1.append(1);                    //hello world1
            System.out.println(sb1);          //hello world1
            System.out.println(sb1 == sb2);   //true
            System.out.println(sb1.length());    //获取字符串的有效长度12
            System.out.println(sb1.capacity());  //获取底层数组的总大小
            sb1.setCharAt(0, 'H');     //设置任意位置的字符 Hello world1
            sb1.insert(0, "Hello world!!!");         //Hello world!!!Hello world1
            System.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不就好了嘛~不需要考虑线程安全问题了
不行!!!会浪费很多资源,加锁和释放锁都会浪费资源!
💛💛💛本期内容回顾💛💛💛
在这里插入图片描述
✨✨✨本期内容到此结束啦~

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

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

相关文章

【易生支付官网注册/登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞…

宁盾身份域管与天翼云电脑完成兼容互认证

近日,宁盾身份域管与天翼云电脑完成兼容互认证!这是继中兴、深信服、升腾威讯云桌面/云电脑后,宁盾对接的第4个国产云桌面品牌。企业在引入国产云桌面时,同时会考虑微软AD目录的替代方案。宁盾国产化身份域管对接天翼云电脑从终端…

【刷题(13)】二分查找

一、二分查找基础 &#xff08;1&#xff09;int mid ((right - left) >> 1) left; &#xff08;2&#xff09;lower_bound的底层实现 int lower_bound(vector<int>& nums, int x) {int left 0;int right nums.size() - 1;// 区间为 左闭右闭while (lef…

[leetcode hot 150]第一百九十一题,位1的个数

题目&#xff1a; 编写一个函数&#xff0c;输入是一个无符号整数&#xff08;以二进制串的形式&#xff09;&#xff0c;返回其二进制表达式中设置位的个数&#xff08;也被称为汉明重量&#xff09;。 这道题比较简单&#xff0c;直接对最后一位进行与1的与操作&#xff0c;然…

【RSGIS数据资源】1981-2021年中国陆地生态系统蒸腾蒸散比数据集

文章目录 摘要基本信息数据结构和内容采集方法信息数据处理方法与数据质量 摘要 本数据集涵盖了中国陆地生态系统蒸腾蒸散比&#xff08;T/ET&#xff09;、蒸腾&#xff08;T&#xff09;及蒸散&#xff08;ET&#xff09;三组数据。基于模型-数据融合方法&#xff0c;集成PT…

android11禁止进入屏保和自动休眠

应某些客户要求&#xff0c;关闭了开机进入屏保&#xff0c;一段时间会休眠的问题。以下diff可供参考&#xff1a; diff --git a/overlay/frameworks/base/packages/SettingsProvider/res/values/defaults.xml b/overlay/frameworks/base/packages/SettingsProvider/res/value…

Shell编程之正则表达式与文本处理器

正则表达式的定义 正则表达式又称正规表达式&#xff0c;常规表达式。在代码中常简写为 regex、regexp 或 RE。 正则表达式是使用单个字符串来描述、匹配一系列符合某个句法规则的字符串&#xff0c;简单来说&#xff0c; 是一种匹配字符串的方法&#xff0c;通过一些特殊符号&…

Spring +SpringMVC+Mybatis项目详细构造

一&#xff0c;文档详解 1&#xff0c;web.xml配置 配置spring监听器&#xff1a; 指定spring配置文件的位置和名称&#xff0c;扫描会先扫描此文件&#xff0c;此文件中的扫描文档作为父类扫描&#xff0c;父类扫描不可访问子类扫描&#xff0c;子类扫描可访问父类扫描 &l…

go语言的使用方法

一.go语言的介绍 1.简介 2.应用领域 3.使用go语言的公司 4.go语言开发工具介绍 5.go语言开发环境搭建 【1】搭建Go开发环境-安装和配置SDK 基本介绍: 1).SDK的全称(Software Development Kit软件开发工具包&#xff09;2).SDK是提供给开发人员使用的&#xff0c;其中包含了…

记一次SpringCloud OpenFeign 服务调用传递 token @Async 上下文信息获取失败

一、场景 在异步方法中使用了feign调用&#xff0c;发现提示“您还未登录或登录已失效”。那原因很明了就是我的登录信息没办法传入到feign的调用方法里。 二、考虑的解决办法 1&#xff09;尝试一&#xff1a;ServletRequestAttributes attributes (ServletRequestAttrib…

高维数组到向量的转换:两种方法的深度解析

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言&#xff1a;高维数组的挑战与需求 二、方法一&#xff1a;使用NumPy库进行展平 示…

【数据分析面试】56.数据格式转换(Python:melt函数)

题目 给定一个df&#xff0c;包含ABCDE多个列。请编写一个 Python 程序&#xff0c;将列 ‘D’ 和 ‘E’ 转换为长格式&#xff0c;并使用 ‘A’、‘B’ 和 ‘C’ 作为标识符。 换句话说&#xff0c;将数据中的D、E两列转换为行&#xff0c;使数据从宽变长。 示例&#xff1…

BH-0.66 6000/5/150电流互感器 塑壳 JOSEF约瑟

BH-0.66 15/5塑壳式电流互感器 BH-0.66 20/5塑壳式电流互感器 BH-0.66 30/5塑壳式电流互感器 BH-0.66 40/5塑壳式电流互感器 BH-0.66 50/5塑壳式电流互感器 BH-0.66 75/5塑壳式电流互感器 BH-0.66 100/5塑壳式电流互感器 BH-0.66 150/5塑壳式电流互感器 BH-0.66 200/5塑壳式…

职校老师的工资待遇怎么样

工资水平一直是教师们关注的焦点&#xff0c;毕竟&#xff0c;工资不仅关系到个人的生活品质&#xff0c;还影响着教师的职业满意度和工作动力。职校教师的工资待遇究竟是怎样的呢&#xff1f; 职校教师的工资水平受多种因素影响&#xff0c;包括地区、学校类型、个人资历和教学…

【OrangePi AIpro】香橙派 AIpro 为AI而生

产品简介 OrangePi AIpro(8T)&#xff1a;定义边缘智能新纪元的全能开发板 在当今人工智能与物联网技术融合发展的浪潮中&#xff0c;OrangePi AIpro(8T)凭借其强大的硬件配置与全面的接口设计&#xff0c;正逐步成为开发者手中的创新利器。这款开发板不仅代表了香橙派与华为…

pyqt Qtreeview分层控件

pyqt Qtreeview分层控件 介绍效果代码 介绍 QTreeView 是 PyQt中的一个控件&#xff0c;它用于展示分层数据&#xff0c;如目录结构、文件系统等。QTreeView 通常与模型&#xff08;如 QStandardItemModel、QFileSystemModel 或自定义模型&#xff09;一起使用&#xff0c;以管…

【机器学习300问】105、计算机视觉(CV)领域有哪些子任务?

计算机视觉作为人工智能的重要分支&#xff0c;发展至今已经在诸多领域取得显著的成果。在众多的计算机视觉任务中&#xff0c;图像分类、目标检测与定位、语义分割和实例分割是四个基本而关键的子任务&#xff0c;它们在不同的应用场景下扮演着重要角色。这四个子任务虽然各具…

【408真题】2009-23

“接”是针对题目进行必要的分析&#xff0c;比较简略&#xff1b; “化”是对题目中所涉及到的知识点进行详细解释&#xff1b; “发”是对此题型的解题套路总结&#xff0c;并结合历年真题或者典型例题进行运用。 涉及到的知识全部来源于王道各科教材&#xff08;2025版&…

Ps系统教程03

选区工具的组合使用 先用魔棒将大致区域点击圈主 会发现一些零散的小区域 使用套索工具进行区域的加减&#xff08;按住shift/alt键进行相关区域加减&#xff09; 可以放大查看 基本处理完细节之后 如果把不用的填充背景直接按delete删除&#xff0c;那么原版图案就会…

研学活动报名二维码怎么制作?

在组织研学活动时&#xff0c;老师们经常面临报名流程繁琐、信息收集不全面、统计工作耗时等问题&#xff1f;如何高效地管理学生的报名信息&#xff0c;确保活动顺利进行呢&#xff1f; 现在我们有了更多的选择。老师们可以快速制作出研学活动的研学活动报名二维码怎么制作&am…