【剧前爆米花--爪哇岛寻宝】String类型构造,修改的底层逻辑与StringBuilder和StringBuffer的关系

news2024/11/20 4:27:30

作者:困了电视剧

专栏:《JavaSE语法与底层详解》

文章分布:这是一篇关于String类型及其底层构造的文章,如有疏漏,欢迎大佬指正!

 

String对象的创建

字符串的用法比较多,所以String类提供的构造方式也比较多,这里展示三种常用的构造方式:

public static void main(String[] args) {
        String str1="aaa";
        //==============================
        String str2=new String("bbb");
        //==============================
        char[] array={'c','c','c'};
        String str3=new String(array);
    }

了解了如何构建一个字符串后,我们还需要了解String对象底层的构造逻辑,下面让我们打开看一下String类的源码:

可以看到,String是引用类型,内部并不存储字符串本身,字符串实际保存在char类型的数组中,这一点跟C语言构造字符串很像,可以进行参考。

字符串常量池

在工作中,String类是我们使用频率非常高的一种对象类型。JVM为了提升性能和减少内存开销,避免字符串的重复创建,其维护了一块特殊的内存空间,这就是字符串常量池。字符串常量池由String类私有的维护

https://blog.csdn.net/m0_62815572/article/details/127887112在这篇文章中,我简要介绍了java对内存的分区。在jdk7之后字符串常量池被分进了堆区。

当我们创立一个String对象时,比如上述栗子中的str1,由于我之前并没有创建过内容为"aaa"的String对象,所以我的这个"aaa"就会被放入常量池中,当我下次在需要"aaa"这一字符串的时候,java就会从常量池中直接取出节约时间。

public static void main(String[] args) {
        String str1="aaa";
        String str2=new String("aaa");
    }

就比如现在有这样一段代码,他们在内存中的创建方式具体为:

str1直接指向在常量池中的对象 ,str2由于是通过new String对象的方式创建的,所以会单独地在堆区中在开辟一块String的空间,然后这个对象的value数组再指向常量池的"aaa"。

String对象的修改 

由String类的源码我们可以看到value数组是由final修饰的,并且当一个String对象被创建后,其字符串的值会被放在常量池中,value数组也会指向字符串的地址,那此时如果我想对字符串进行修改怎么办,让我们反编译一下,看看java是怎样做的:

现在有这样一段简单的代码,它的运行结果也在意料之中 

这就是这段代码在运行过程中的背后逻辑了,我们可以发现一个神奇的点,java程序为了完成这一操作引用了StringBuilder类,根据注释我们可以理解他大体的逻辑就是:先创建一个StringBuilder对象,然后这个对象通过append方法实现字符串的拼接,最后运用toString方法,将拼接后的字符串返回成一个String对象,完成功能。那这个StringBuilder类又是什么呢?

StringBuilder类

我们打开StringBuilder的源码一探究竟

由这我们可以看出StringBuilder和String的一个很大的区别就是,StringBuilder的value数组并没有被final所修饰,也就是他不是一个常量,可以更改指向,再看一下append方法

 

可以看出在append方法中,append完成字符串的拼接后不会return一个新的对象而是return this,所以如果我们需要大量的拼接操作的话,用StringBuilder类会节约很多资源,提高效率。 

举个栗子

String str = new String("ab"); // 会创建多少个对象
String str = new String("a") + new String("b"); // 会创建多少个对象

第一个是创建两个对象。

第二个会创建一个StringBuilder对象,这个对象完成拼接后由于接受的是String对象所以还会进行一次toString创建一个String对象,所以一共6个对象。

StringBuilder类与StringBuffer类的区别

 

这两个类的父类相同,在重写的方法中 

StringBuffer多了一份线程上相关知识的运用,在本质上没有太大的区别。 

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

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

相关文章

算法复杂度 O(1),O(n),O(logn),O(nlogn)的区别

算法复杂度分为时间复杂度和空间复杂度 时间复杂度是指执行这个算法所需要的计算工作量空间复杂度是指这个算法所需要的内存空间 1.对于一个循环,假设循环体的时间复杂度为O(n),循环次数为n,则这个循环的时间复杂度为O(n*1)。 void aFunc(int n) {for…

嵌入式终端的以太网系统简析

一 初识以太网电路 从硬件的角度看,以太网接口电路主要由 MAC(Media Access Control)控制器和物理层接口 PHY(Physical Layer)两大部分构成,一般一个嵌入式终端系统的以太网硬件抽象 如下: 1 网…

数字孪生教学楼3d可视化系统功能介绍

目前,校园教学楼运维管理阶段面临的主要难题有:数据采集不全、数据各自为阵的数据孤岛现象严重;系统的集成度低,缺乏统一、有效的运行维护处理中心平台;能耗巨大,不符合绿色建筑要求,未形成有效…

做了多年的Android开发,自己是否有擅长领域?(Framework 篇)

前言 如今Android 开发行业的招聘需求可谓是越来越高了,如果你想入大厂工作,学历还只是他们的基础入门的门槛,他们不仅要看学历还得看你是否在某块技术领域有着过硬的实力。比如:APP性能优化、Framework底层原理、音视频、APP架构…

数字验证学习笔记——SystemVerilog芯片验证17 ——数组约束

一、数组约束 1.1 数组的属性约束 多数情况下,数组的大小应该给定范围,防止生成过大体积的数组或者空数组此外还可以在约束中结合数组的其他方法sum(),product(),and(&a…

Ansys Zemax | 如何在 OpticStudio 中模拟人眼

本文是人眼模型的一个案例研究,并提供了更高级的序列模式建模技术的演示。我们将在OpticStudio中使用Liou & Brennan 1997眼睛模型创建人眼模型。在OpticStudio中成功生成这个眼睛模型后,我们将使用它来设计一个自由形式的渐进眼镜镜片。 下载 联系…

正大国际期货:2022年各行业顶级富豪身价大洗牌

2022年各行业顶级富豪身价大洗牌 富豪身价较2021年年底变动幅度涨跌幅 行业:加密货币,币安创始人:赵长鹏816%,身价174亿美元 行业:基建、大宗商品,阿达尼集团创始人:高塔姆阿达尼210%&#x…

Linux下Python脚本的编写(二)

今天试着把两个shell小脚本转化成Python版本 一. 脚本1 判断所接的nvme 在哪个CPU上 #!/bin/bash lscpu |grep -i node for nvme in nvme list|sed 1,2d|awk {print $1}|awk -F "/" {print $NF} doecho $nvmebusid$(readlink -f /sys/block/$nvme |cut -d / -f 6)ec…

【解决】VMware虚拟机中ubuntu系统联网问题——以桥接模式解决

问题描述 由于需要通过笔记本的蓝牙与外接设备进行通信,我使用的是无线网。所以需要使用VMware中提供的桥接模式,借助笔记本的无线网卡进行联网,之前设置过一次,能够正常运行,但是关机后,可能加载的快照不同…

维视智造成为苏州市人工智能行业协会首届会员单位

近日,以“智者相偕聚势赋能”为主题的苏州市人工智能行业协会一届一次会员大会暨成立大会在苏州举行,来自全市200多家人工智能相关单位的代表以及人工智能领域的知名学者、产业专家、企业家参加了会议。维视智造作为协会的首届会员,与苏州市工…

2022/12/28总结

今天AC了一道题(后面的题目对我来说好难,刷不动了) P2895 [USACO08FEB]Meteor Shower S P2895 [USACO08FEB]Meteor Shower S_lxh0113的博客-CSDN博客 学的新知识: dijkstra算法 dijkstra算法是求最短路径的算法。相比较于flo…

【真干货】Activiti7工作流如何使用?看这里

一. 前言 近日文哥有个毕业学员在公司开发时遇到了工作流的相关业务场景。在这里,文哥给大家精心准备了以Activiti为代表的工作流简单使用教程,希望能给有需要的小伙伴们一些帮助。下面我们就来开始介绍Activiti工作流的基本使用情况。 二. Activiti工…

利器 | Java 接口自动化测试首选方案:REST Assured 实践 (一)

在 REST Assured 的官方 GitHub 上有这样一句简短的描述: Java DSL for easy testing of REST services 简约的 REST 服务测试 Java DSL REST Assured 官方的 README 第一句话对进行了一个优点的概述,总的意思表达的就是简单好用。那么 REST Assured 有…

dolphinscheduler 调用shell脚本执行sql

1. 资源中心--创建文件 脚本&#xff1a; #!/bin/bash hive <<EOF alter table app.app_bi_test drop partition (dayid$1); insert overwrite table app.app_bi_test partition(dayid) select a.Ccode,a.inCcode ,a.Cname ,$1,COALESCE(b.num,0) ,COALESCE(c.c_num…

以前的任何一个行业只要与互联网技术产生联系,便焕发生机与活力

事实上&#xff0c;以往&#xff0c;我们所经历的那个互联网玩家频出的年代&#xff0c;其实就是一个以互联网技术为主导的年代。在那样一个年代里&#xff0c;互联网技术几乎是解决一切痛点和难题的万能解药&#xff0c;几乎是破解一切行业痛点和难题的杀手锏。任何一个行业&a…

XXE渗透与攻防(一)

目录 前言 XML基础知识 XML用途 XML内容 XML格式要求 XML格式校验 不同语言支持的协议 完整的XML内容 什么是XXE 案列演示 盲打-DNSLog XXE 防御 前言 现在许多不同的客户端技术都可以使用XMl向业务应用程序发送消息&#xff0c;为了使应用程序使用自定义的XML消…

高压放大器在介电泳分选的应用

实验名称&#xff1a;基于高压放大器的介电泳分选 研究方向&#xff1a;滴液分选 测试原理&#xff1a; 在非均匀电场中&#xff0c;介电体表面感生出的正负电荷处于不同场强的位置上在它受到的合力大于一定值时就会被拉向强电场方向。 测试设备&#xff1a;ATA-7030高压放大器…

类与对象(下)

类与对象构造函数构造函数体赋值初始化列表explicit关键字static成员概念特性友元友元函数友元类内部类匿名对象拷贝对象时的一些编译器优化构造函数 构造函数体赋值 在创建对象时&#xff0c;编译器通过调用构造函数&#xff0c;给对象中各个成员变量一个合适的初始值 clas…

勃仔诞生记:Hubbleverse哈勃元宇宙的起源故事

欢迎来到Hubbleverse &#x1f30d; 关注我们 关注宇宙新鲜事 &#x1f4cc; 预计阅读时长&#xff1a;9分钟 本文仅代表作者个人观点&#xff0c;不代表平台意见&#xff0c;不构成投资建议。 想象一个属于你的世界&#xff0c;一个资源丰富的世界&#xff0c;你可以在其中…

Android TV刷机Mstar篇——以乐视超4-X50Pro为例

家里这台乐视使用好几年了&#xff0c;最近闲来无事&#xff0c;就琢磨着刷一刷&#xff0c;打造一个纯净使用体验。 记录下刷机历程&#xff0c;方便后期再查看。 一、准备工作 1、下载刷机固件&#xff0c;这里使用了ZNDS大神出的包。 超4X43 Pro/超4X50 Pro通用流畅精简…