Java--String类(StringBuilder与StringBuffer)

String类的特征:

        String类的特点:

1. String 类在设计时就是不可改变的, String 类实现描述中已经说明了

        String部分源码如下:

2. 所有涉及到可能修改字符串内容的操作都是创建一个新对象,改变的是新对象
        例如replace方法:

   public static void main(String[] args) {String s1 = "abcdef";String s2 = s1.replaceAll("a","b");System.out.println(s2);}

        我将所有的a换成b,此时究竟是在原来的字符串基础上改呢?还是new了一个新的String类?

源码如下:

        

里面确实new了一个新的String类!!!

注意:

final 修饰类表明该类不想被继承, final 修饰引用类型表明该引用变量不能引用其他对象,但是其引用对象中的内 容是可以修改的

例如: 

 public static void main(String[] args) {final int array[] = {1,2,3,4,5};int arr[] = {1,2,3};array[0] = 100;System.out.println(Arrays.toString(array));
// array = new int[]{4,5,6}; // 编译报错:Error:(19, 9) java: 无法为最终变量array分配值
为什么 String 要设计成不可变的 ? ( 不可变对象的好处是什么 ?) ( 选学 )
1. 方便实现字符串对象池 . 如果 String 可变 , 那么对象池就需要考虑写时拷贝的问题了 .
2. 不可变对象是线程安全的.
3. 不可变对象更方便缓存 hash code, 作为 key 时可以更高效的保存到 HashMap

字符串修改:

        刚刚解释完,String中的字符串中的char[]数组引用被final修饰,不可再引用其他对象!!
所以要想修改字符串肯定是new一个新的String引用其他字符串!

    public static void main(String[] args) {String s = "hello";s += " world";//s = s+"world"System.out.println(s); // 输出:hello world}

 我们可以从反汇编代码的角度观察一下:

 我们也可以用另一套代码写出同样的效果:

    public static void main(String[] args) {String s = "hello";StringBuilder stringBuilder = new StringBuilder();stringBuilder.append(s);stringBuilder.append("world");s = stringBuilder.toString();System.out.println(s);}

通过反汇编可以看到本质,相当于new了一个新的对象,也就是一共有三个对象参加这次运行。有人问了,哪有三个对象,我怎么看不到。

我们一起来分析一下:

s是不是一个对象!

world也是一个对象!

注意,这里的toString也会返回一个新的对象:
源代码如下:

所以说最后肯定是一个新的对象,只不过是s引用了这个新的对象!!

这时候应该提出疑问,这个StringBuilder这个类是干什么的??

接下来一探究竟:

StringBuilder类与StringBuffer类:

        由于String 的不可更改特性,为了方便字符串的修改, Java 中又提供 StringBuilder StringBuffer 类。这两个类大部分功能是相同的,这里介绍 StringBuilder 常用的一些方法,

StringBuilder:

StringBuilder方法也是不可被继承的,而且继承了父类AbstractStringBuilder类,同时还有两个接口!

构造函数:

StringBuilder构造函数有好多重载:

例如:

1、无参构造:
                

2、传整型构造:

3、传字符串构造:

那么每次构造如果调用了super(),这个究竟是干什么的,得从父类入手:

AbstractStringBuilder类:

        

我们发现父类中有两个成员变量:

有一个是字符数组,一个是整型。

而且如果是传带有参数的super会调用第二个构造函数,我们发现其实他是在new一个大小为capacity的字符数组!!

也就是它的底层是字符数组,在字符数组的基础上进行修改,也就不会多次new性的对象,提高性能!

append方法:

该方法就可以实现追加功能,也就是修改字符串,他是怎么实现的呢?

   public AbstractStringBuilder append(String str) {if (str == null)return appendNull();int len = str.length();ensureCapacityInternal(count + len);str.getChars(0, len, value, count);count += len;return this;}

 当然append方法也有许多重载的方法,传入的参数有所差异。

就拿传一个字符串类型为例:
我们可以不用去管具体的实现细节,但是我们可以看出,在这个过程中没有再new一个新的对象,而且最后返回的还是自己。

这里就与String类型中的拼接字符串是有区别的了!!

我们可以用Stringbuilder类中的append方法完成拼接:

    public static void main(String[] args) {StringBuilder stringBuilder = new StringBuilder("abcd");stringBuilder.append("efg");System.out.println(stringBuilder);}

 注意:最后打印的时候直接传入stringbuild即可。

reverse反转字符串:

        这个方法也很厉害,在StringBuilder类的方法中有一个方法可以直接反转字符串!!

例如:

    public static void main(String[] args) {StringBuilder stringBuilder = new StringBuilder("abcdef");stringBuilder =  stringBuilder.reverse();System.out.println(stringBuilder);}

注意:

reverse方法的返回值是stringbuilder类型!!

StringBuffer:

StringBuffer和StringBuilder是差不多的,包括一些方法,用法都是差不多的。

但是唯一的区别是什么:

 我们需要关注一下它的append方法:

我们发现类比StringBuilder多了一行代码:

这行代码是干什么的呢?

这行代码可以理解为是一把锁,当程序运行时会所起来,结束后才会解开:

主要运用在多线程中!

 String、StringBuilder、StringBuffer的区别:

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

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

基于SpringBoot的考研助手系统+LW参考示例

系列文章目录 1.基于SSM的洗衣房管理系统原生微信小程序LW参考示例 2.基于SpringBoot的宠物摄影网站管理系统LW参考示例 3.基于SpringBootVue的企业人事管理系统LW参考示例 4.基于SSM的高校实验室管理系统LW参考示例 5.基于SpringBoot的二手数码回收系统原生微信小程序LW参考示…

DepthCrafter:为开放世界视频生成一致的长深度序列

通过利用视频扩散模型,我们创新了一种新颖的视频深度估算方法–DepthCrafter。 它可以为开放世界视频生成具有细粒度细节的时间一致性长深度序列,而无需摄像机姿势或光流等附加信息。 简介 动机。 尽管在静态图像的单目深度估算方面取得了重大进展&…

光学工程基础知识-透射原理

光学玻璃:一般光学无色玻璃只能透过波段为0.35一2.5μm的光,超出 光谱范围的光将被材料强烈吸收。 无色玻璃可分为两大类:冕牌玻璃(K)和火石玻璃()。 冕牌玻璃:折射率低、色散低 火石玻璃:折射率高、色散高 透射材…

【解决方案】LIMS实验室管理系统功能需求及建设方案(Word)

实验室管理系统建设方案旨在全面提升实验室运营效率与数据管理水平。该系统集成主页统计概览全局,实现委托登记便捷化、式样分发自动化。支持标签打印与试验管理,确保流程规范。数据审核与报告编制模块强化质量控制,原始数据可追溯&#xff0…

道路裂缝,坑洼,病害数据集-包括无人机视角,摩托车视角,车辆视角覆盖道路

道路裂缝,坑洼,病害数据集 包括无人机视角,摩托车视角,车辆视角 覆盖道路所有问题 一共有八类16000张 1到7依次为: [横向裂缝, 纵向裂缝, 块状裂缝, 龟裂, 坑槽, 修补网状裂缝, 修补裂缝, 修补坑槽] 道路病害(如裂缝、…

【C++算法】位运算

位运算基础知识 1.基础运算符 << : 左移 >> : 右移 ~ : 取反 & : 按位与&#xff0c;有0就是0 I : 按位或&#xff0c;有1就是1 ^ : 按位异或&#xff0c;&#xff08;1&#xff09;相同为0&#xff0c;相异为1&#xff08;2&#xff09;无进位相加 2.…

使用ENVI之辐射定标

将下载好的遥感影像导入遥感影像处理软件ENVI 5.6中 使用ENVI 5.6的Toolbox中的Radiometric Calibration工具 跳出的Date Input File界面中选中要进行辐射定标的文件选中 再在跳出的Radiometric Calibration界面中将Output Interleave改为BIL再点击Apply FLAASH Settings Soale…

【Spring Security系列】如何用Spring Security集成手机验证码登录?五分钟搞定!

作者&#xff1a;后端小肥肠 &#x1f347; 我写过的文章中的相关代码放到了gitee&#xff0c;地址&#xff1a;xfc-fdw-cloud: 公共解决方案 &#x1f34a; 有疑问可私信或评论区联系我。 &#x1f951; 创作不易未经允许严禁转载。 姊妹篇&#xff1a; 【Spring Security系列…

今天中秋,中秋快乐,分析一个中秋月饼的项目

特色功能 使用obj模型&#xff0c;搭配tga文件&#xff0c;附加上颜色 normalMap 是让字和线条看起来更清楚和真实 高光贴图 凹凸贴图 ...... 源码 https://github.com/Lonely1201/lonely1201.github.io/tree/main/Juejin/mooncake 在线预览 https://lonely1201.githu…

TensorRT-LLM——优化大型语言模型推理以实现最大性能的综合指南

引言 随着对大型语言模型 (LLM) 的需求不断增长&#xff0c;确保快速、高效和可扩展的推理变得比以往任何时候都更加重要。NVIDIA 的 TensorRT-LLM 通过提供一套专为 LLM 推理设计的强大工具和优化&#xff0c;TensorRT-LLM 可以应对这一挑战。TensorRT-LLM 提供了一系列令人印…

828华为云征文 | 华为云X实例的镜像管理详解

前言 随着云计算的不断普及&#xff0c;云服务器成为企业和开发者日常工作中的重要工具。为了提升工作效率和降低运维成本&#xff0c;云服务器镜像的管理尤为重要。镜像作为服务器或磁盘的模板&#xff0c;预装了操作系统、软件及配置&#xff0c;是快速部署和迁移业务的重要…

【Linux】进程序言

这里是阿川的博客&#xff0c;祝您变得更强 ✨ 个人主页&#xff1a;在线OJ的阿川 &#x1f496;文章专栏&#xff1a;Linux入门到进阶 &#x1f30f;代码仓库&#xff1a; 写在开头 现在您看到的是我的结论或想法&#xff0c;但在这背后凝结了大量的思考、经验和讨论 目录 1.…

【例题】lanqiao4397 图书排序

在希尔排序的基础上&#xff0c;对数组(w0,id0)进行排序&#xff0c;先排权重w&#xff0c;再排id. nint(input()) w[] for _ in range(n):id0,w0map(int,input().split())w.append((w0,id0)) def shell_sort(a):gapn//2while gap>0:for i in range(gap,n):tmpa[i]jiwhile …

水下目标检测数据集 urpc2021

项目背景&#xff1a; 水下目标检测在海洋科学研究、水下考古、海洋资源勘探等多个领域具有重要的应用价值。由于水下环境的复杂性和多变性&#xff0c;传统的人工检测方法存在诸多限制&#xff0c;自动化检测技术的需求日益增加。URPC2021数据集旨在为水下目标检测提供高质量…

【C++】STL数据结构最全函数详解2-向量vector

关于STL&#xff0c;我们之前浅浅提过&#xff1a;这里 另外对于栈&#xff0c;这里有更加详尽的介绍&#xff1a;CSTL常用数据结构1详解---栈&#xff08;stack&#xff09;-CSDN博客 这个系列将会更加深入地从函数原型开始用详细的例子解释用法 首先这一篇介绍的是一个非常…

macOS Sequoia发布:Apple又给我们带来了什么惊喜?

今天是个激动人心的日子,尤其是对于Mac用户来说,因为Apple正式发布了全新的操作系统——macOS Sequoia。作为一款专为Mac设备设计的操作系统,Sequoia不仅仅是简单的升级,它承载了Apple在系统体验上的巨大飞跃。听到这个消息,你可能会好奇,Apple这次又会带来什么样的创新?…

ABC371E I Hate Sigma Problems 题解

ABC371E I Hate Sigma Problems 题解 题目描述问题陈述限制因素 样例1解析题解(1) 暴力枚举做法代码运行结果 (2) 暴力优化做法代码运行结果 正解代码运行结果 结语 题目描述 问题陈述 给你一个长度为 N N N 的整数序列 A ( A 1 , A 2 , … , A N ) A (A_1, A_2, \ldots,…

PyCharm 安装教程

传送门 PyCharm 是一款由 JetBrains 开发的强大的 Python 集成开发环境&#xff08;IDE&#xff09;。它支持多种功能&#xff0c;包括调试、代码补全、智能代码分析、版本控制集成等&#xff0c;特别适合开发 Python 项目。接下来&#xff0c;我们将详细介绍如何在不同操作系…

每日一个数据结构-跳表

文章目录 什么是跳表&#xff1f;示意图跳表的基本原理跳表的操作跳表与其他数据结构的比较 跳表构造过程 什么是跳表&#xff1f; 跳表&#xff08;Skip List&#xff09;是一种随机化的数据结构&#xff0c;它通过在有序链表上增加多级索引来实现快速查找、插入和删除操作。…