String 底层为什么使用 final 修饰?

news2024/7/6 18:39:59

1、典型回答

对于这个问题,Java之父詹姆斯 ·高斯林(James Gosling) 是这样回答的:

I would use an immutable whenever I can

翻译为中文:只要允许,我就会使用不可变对象

而作为普通人的我们来说,理解 String 为什么要用 final 来修饰,可以从以下方面入手:

1、安全性:由于 String 是不可变类,即不能被修改,所以使用 final 修饰可以确保 String 类的内部结构不能被修改,从而保证了 String 的数据的安全性。例如这幅图中的 “0X1010”,系统中只要认定这个指针之后,它就不能被改变了,从而就保证了其安全性(但是,需要注意的是,安全这个概念永远是相对的,没有绝对的安全,所以不要死扣字眼)

2、线程安全性:String 是不可变的,因此多个线程可以同时访问和共享 String 对象,而无需进行额外的同步措施。这样可以提高程序的并发性能并减少线程安全问题的出现。线程不安全是由于,多个线程同时修改同一个变量才会导致线程安全问题,而 String 是不可变的,每次操作的都是新对象,那么多个线程操作的就是各自的新对象了,那么就不会有线程安全问题了

3、用作键值的准确性:由于 String 的不可变性,它可以安全地用作 HashMap、HashSet 等集合类的键值,这样可以确保散列算法的准确性,避免因修改 String 对象导致哈希值发生变化的情况

4、性能:String 类在许多地方被广泛使用,使用 final 修饰可以使编译器在编译时对 String 类进行一些优化,从而提高程序的执行效率

2、全面剖析

使用 final 修饰 String 可以保证安全性、线程安全性、可稳定的用作键值和提供程序性能

在 String 的源码实现中,不单单是类使用 final 修饰,其中的很多属性也使用了 final 进行修饰了,如下所示:

3、知识扩展

String 既然是不可变的,那么它的 “+” 操作是怎么实现的呢?

String “+” 操作底层实现

当我们将字符串反编译的时候,就能看出 String的 “+” 操作是怎么实现了,例如以下代码:

 以上代码反编译的代码如下(使用 jad 反编译):

 从上述代码可以看出,String的 “+” 操作是使用 StringBuilder 的 append 来实现的

String、StringBuilder、StringBuffer 有什么区别?-CSDN博客

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

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

相关文章

【历年论文真题考点汇总】与【历年论文原题2009~2023年文字版记录】(2024年软考高级系统架构设计师冲刺知识点总结-论文篇-先导篇)

历年真题论文题考点汇总 历年软考系统架构设计师论文原题(2009-2022年) 因最新的2023年目前仅能搜索到回忆版,等楼主搜集到真题会更新最新版到本文中。 注意系统架构设计师一年只下半年开考,项目管理师一年两次开考。 2022年下半年-论文原题 试题1:论基于构件的软件开发…

智海Mo 平台与 Datawhale 携手浙江大学,共襄 AI+X 高校行!

2024年3月9日,一场以"AIX 高校行"为主题的活动在浙江大学成功举办。本次活动由 Datawhale 与杭州市人工智能学会主办,浙江大学人工智能研究所、浙江大学控制科学与工程学院联合主办,浙江大学学生人工智能协会承办,趋动云…

基础小白快速入门web前端开发技术------->hbuilder的下载安装以及简易的网页最开始制作

工欲善其事,必先利其器, 在我们学习开发网页设计,我们首先需要一个良好的开发工具 这里我比较推荐hbuilder这个 只需要进入官网傻瓜下载,傻瓜安装 https://dcloud.io/ 点击hbuilder选择版本进行下载安装即可 hbuilder的新建文件…

【VUE合并同一列相另的行的数据合并为一行:span-method】亲测有用

【VUE合并同一列相另的行的数据合并为一行:span-method】亲测有用 第一步: 给table加对应的标签的属性 :data"list" :span-method"arraySpanMethod"第二步: 在methods中添加对应的处理的方法 arraySpanMethod({ row, …

MQTT+ONENET+STM32+LWIP驱动

前言 近段时间由于项目需求,需要将原来的项目增加应用层的MQTT协议,由于不懂MQTT所以从B站学习了正点原子的lwip课程,看完后需要进行实践,所以选择了ONENET平台来作为学习的时间的平台。 1、学习准备 先下载工具: …

鸿蒙原生应用元服务开发-WebGL网页图形库开发接口说明

一、场景介绍 WebGL主要帮助开发者在前端开发中完成图形图像的相关处理,比如绘制彩色图形等。目前该功能仅支持使用兼容JS的类Web开发范式开发。 二、接口说明 表1 WebGL主要接口列表 本文参考引用HarmonyOS官方开发文档,基于API9。

Vue-Router学习笔记

文章目录 一、Vue Router简介二、简单使用三、动态路由匹配3.1 响应路由参数的变化3.2 捕获所有路由或 404 Not found 路由 四、路由的匹配语法4.1 在参数中自定义正则4.2 可重复的参数4.3 Sensitive 与 strict 路由配置4.4 可选参数 五、嵌套路由嵌套的命名路由 六、编程式导航…

利用百度竞价排名推广增加转化率-华媒舍

在数字营销领域,提高网站转化率是一个重要的目标。百度竞价排名是一种有效的推广方式,通过提高网站在搜索结果中的排名,能够吸引更多的用户点击,并且增加转化率。本文将介绍如何利用百度竞价排名来推广,并且提供一些最…

外盘国际期货分仓系统VUE源码展示

国际期货市场已经成为投资者追求高收益的重要战场。然而,面对复杂多变的市场环境,如何高效、安全地进行期货交易,成为了投资者们共同面临的挑战。今天,我们荣幸地向您推荐一款引领期货交易新风尚的利器——外盘国际期货分仓系统VU…

Leetcode刷题【每日n题】(7)

题目一 思路分析 中序遍历:先遍历左子树,再输出根节点,再遍历右子树 1.若当前节点的左子节点不为空,则递归遍历2.输出当前节点(根节点)3.若当前节点的左子节点不为空,则递归遍历 代码解析 cl…

知识文档管理系统平台:企业管理的王炸

无论是企业内部的文件共享,还是团队之间的协作编辑,知识文档管理系统都能发挥巨大的作用。它帮助企业整理、存储和查找各种文档资料,这不仅能提高企业的工作效率,还能增强企业的竞争力。今天就跟着LookLook同学一起来深入了解知识…

SDWAN专线对企业接入有门槛吗

SD-WAN(软件定义广域网)技术作为一种新型的网络解决方案,正在成为企业网络接入的热门选择。然而,对于企业来说,接入SD-WAN专线是否存在门槛,是一个值得探讨的问题。本文将从不同角度分析SD-WAN专线对企业接…

网络安全之URL过滤

知识改变命运,技术就是要分享,有问题随时联系,免费答疑,欢迎联系! URL过滤是一种针对用户的URL请求进行上网控制的技术,通过允许或禁止用户访问某些网页资源,达到规范上网行为和降低安全风险…

VUE/HTML网页在线编辑AutoCAD DWG文档

猿大师办公助手作为一款专业的网页在线编辑Office插件,不仅支持微软Office、金山WPS及永中Office完整嵌入到最新版Chrome、Ddge、Firefox等浏览器中使用,猿大师还可以把Autodesk的AutoCAD、DWG TrueView、Design Review等软件嵌入到浏览器网页中&#xf…

使用Office的小伙伴一定要把这个打开!关键时候能保命

使用电脑办公的小伙伴一定离不开Office。很多小伙伴在使用Office的时候,基本上都是双击打开对应的软件(Word/Excel/Powerpoint)就直接使用。 这种直接打开之后就使用的习惯很不值得提倡。除非你要记录的东西是一分钟就能完成的。 小白在企业上…

anaconda 4.4.0使用手册

安装完成后,anaconda 4.4.0自带的python版本是3.6.1 查看conda中的环境会发现只有root,别的都没有。 在这种情况下,是无法升级python版本的,安装python会报错,需要先新建一个环境。 然后activate 这个环境&#xff…

C语言--从零开始的扫雷游戏

C语言--从零开始的扫雷游戏 1. 游戏说明2. 总体代码3. 详细讲解3.1 菜单部分3.2 游戏主体部分3.2.1 总体分析3.2.2 棋盘初始化3.2.3 棋盘展示3.2.4 设置地雷3.2.5 扫雷阶段3.2.6 统计雷个数的代码3.2.7 使用迭代的方式进行展开:3.2.8 扫雷部分主体代码 4. 总结 1. 游…

阿里云第一次面试记录

java多态? 多态表示一个对象具有多种的状态,具体表现为父类的引用指向子类的实例 Fu f Zi z(); 多态是同一个行为具有多个不同表现形式或形态的能力。 多态就是同一个接口,使用不同的实例而执行不同操作 特点: 对象类型和引用类型…

C++中实现String类

String类实现 概述示例开发环境代码运行结果 注意 概述 本文主要记录自己实现一个String类中的部分功能。 示例 开发环境 Windows下Visual Studio 2019。 代码 MyString.h #pragma once #include <iostream>class MyString{ public:MyString();MyString(char *p);…

c语言函数:atoi与memset

1.atoi函数的头文件stdlib.h 空格跳过&#xff0c;遇到非数字非空格字符准备结束&#xff0c;如果前面有数字则输出数字&#xff0c;没有则输出0&#xff0c;其中-号不受影响&#xff0c;但不输出 memset函数&#xff08;目标值&#xff0c;操作值&#xff0c;字节数&#xff…