图说:为什么Java中的字符串被定义为不可变的

20220513周测 目录 一、单选题 动态创建数组 声明了注解类型 append为true表示追加 File file = new File(“chp13/corejava.txt”); 运行多个服务,服务用什么来区别 404 RandomAccessFile类和File类无关 Java语言中支持UUID的类在哪个包里 String类不可变 length和length() substring() 声明注解中的属性 getAnnotation() finalize()方法的正确形式 显式释放掉.. 阅读详情

字符串,想必大家最熟悉不过了,通常我们在代码中有几种方式可以创建字符串,比如:String s = "Hollis";这时,其实会在堆内存中创建一个字符串对象,其中保存了一个字符数组,该数组中保存了字符串的内容。

上面的箭头可以理解为“存储他的引用”。

当我们在代码中连续创建两个相同的字符串的时候,其实会指向同一个对象。因为当一个字符串被被创建的时候,首先会去这个字符串池中查找,如果找到,直接返回对该字符串的引用。

但是,如果在程序中明确声明要新创建一个字符串的话是可以在堆上重新创建一个对象的。如String s = new String("Hollis")

 

接着,我们来看两个字符串中常用的操作:截取和连接会发生什么,是在原来的字符串对象上修改还是重新创建字符串呢?

字符串的连接。如String s1 = s.concat("Chuang");

 

 

 

字符串的截取。如String s1 = s.substring(0,2);

从上图中我们可以得到一个结论,那就是——字符串是不可变的,无论发生什么操作,一个已经创建好的字符串的内容不会被改变,对它的任何类似修改的操作其实都是新生成了一个字符串对象。

那么,为什么要定义出不可变对象呢?

 

  • 缓存Hashcode

Java中经常会用到字符串的哈希码(hashcode)。例如,在HashMap中,字符串的不可变能保证其hashcode永远保持一致,这样就可以避免一些不必要的麻烦。这也就意味着每次在使用一个字符串的hashcode的时候不用重新计算一次,这样更加高效。

在String类中,有以下代码:private int hash;

以上代码中hash变量中就保存了一个String对象的hashcode,因为String类不可变,所以一旦对象被创建,该hash值也无法改变。所以,每次想要使用该对象的hashcode的时候,直接返回即可。

  • 使其他类的使用更加便利

在介绍这个内容之前,先看以下代码:

在上面的例子中,如果字符串可以被改变,那么以上用法将有可能违反Set的设计原则,因为Set要求其中的元素不可以重复。上面的代码只是为了简单说明该问题,其实String类中并没有value这个字段值。

  • 安全性

String被广泛的使用在其他Java类中充当参数。比如网络连接、打开文件等操作。如果字符串可变,那么类似操作可能导致安全问题。因为某个方法在调用连接操作的时候,他认为会连接到某台机器,但是实际上并没有(其他引用同一String对象的值修改会导致该连接中的字符串内容被修改)。可变的字符串也可能导致反射的安全问题,因为他的参数也是字符串。

 

 

  • 不可变对象天生就是线程安全的

因为不可变对象不能被改变,所以他们可以自由地在多个线程之间共享。不需要任何同步处理。

总之,String被设计成不可变的主要目的是为了安全和高效。所以,使String是一个不可变类是一个很好的设计。


为什么某些人会一直比你优秀,是因为他本身就很优秀还一直在持续努力变得更优秀,而你是不是还在满足于现状内心在窃喜!

合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!

如何一起学习,有没有免费资料?

欢迎工作一到五年的 Java 的工程师朋友们加入的 Java 架构开发:820251827

本群提供免费的学习指导架构资料以及免费的解答

不懂得问题都可以在本群提出来之后还会有职业生涯规划以及面试指导
 

倍福CX9020(WINCE 7)控制器使用方法和操作 CX9020系列是倍福控制器中较为经济的,操作系统为Windows Embedded Compact 7(简称WINCE7或WINEC7),相对高端控制器(WINES7以上系统),操作系统古老而简洁,上位机软件的编写困难很多,本文是笔者在使用过程中摸索的流程,旨在为CX9020系列的新用户提供参考,也可供其他CE系统的控制器参考。本文中大部分截图采用倍福中国的培训文档,这是由于笔者是在流程走通后再写这篇文章,不想再恢复出厂设置走一遍截图。因笔者在写这篇文章时使用倍福控制器经验并不丰富,难免有纰漏,请读者批评 阅读详情

相关推荐

DINOv2 基于自定义数据集进行图片分类预测

(前提是安装好pytorch)1. pip安装2. 下载dinov2提供的预训练模型,需要自行前往网站上查找dinov2模型进行下载。模型需要下载三个文件:下载完成后将上述三个文件放置在本地一个名为dinov2_base的文件夹中即可。

sinat_34770838的博客 6667

Java字符串替换的方法

java中字符串替换方法主要有三种,分别是replace()、replaceAll()和replaceFirst(),这三种方法可以在三种不同情况应用,下面就由我来具体说明这三种方法的应用情况吧。replace的参数是char和CharSequence,即可以支持字符的替换,也支持字符串的替换(CharSequence即字符串序列的意思,说白了也就是字符串)

zhanchulan的博客 1万+

代码详解——Transformer

对于一个序列,在 time_step 为 t 的时刻,我们的解码输出应该只能依赖于 t 时刻之前的输出,而不能依赖 t 之后的输出。当 Decoder 的输入矩阵和 Mask 矩阵输入矩阵包含 “ I have a cat” (0, 1, 2, 3, 4) 五个单词的表示向量,Mask 是一个 5×5 的矩阵。然后判断是否传入的mask, 如果有mask (mask参数值不为None),则把mask为0的位置,将对应位置的attn的值设为无穷小的负数。可以发现得到的输出和输入的K,Q,V的大小相同。

zyw2002的博客 7218

字符串String的slice、replace、toUpperCase和repeat等方法会不会改变原有字符串

字符串String的内置方法 1. slice()、substr()和substring() 2. replace() 3. toUpperCase()和toLowerCase() 4. ES6中新增的一些方法repeat(),padStart()和padEnd() 都不会修改原有字符串

m0_56026872的博客 3134

PyTorch复现EEG-TCNet踩坑记:从BCI IV2a数据到TCN块缺失的完整解决方案

本文详细解析了使用PyTorch复现EEG-TCNet模型的全过程,重点解决了BCI IV2a数据集预处理和TCN模块缺失的技术难题。通过标准化数据流程、跨受试者验证策略以及三种因果卷积实现方案,为运动想象分类任务提供完整解决方案,帮助研究者高效实现模型复现与优化。

weixin_30699955的博客 319

OpenClaw智能体应用第一集--飞书多智能体配置

本文介绍了智能体(Agent)的核心概念与配置实践。Agent作为独立作用域的"大脑",包含模型(认知引擎)、记忆系统(短期/长期记忆)、人设(角色定义)、工具(外部能力调用)、规划执行(任务拆解)、运行环境等核心要素。每个Agent拥有唯一agentId标识,通过accountId区分渠道账号,Binding机制实现消息路由。实践部分展示了通过命令行配置多个智能体(如writer)的过程,包括插件注册和工具加载。系统支持多Agent架构,可根据不同场景需求灵活配置专属智能体。

weixin_44626085的博客 1749

字符串方法中会修改原字符串_字符串padStart()方法

字符串方法中会修改原字符串The purpose of string padding is to add characters to a string, so it reaches a specific length. 字符串填充的目的是在字符串中添加字符 ,使其达到特定长度 。 padStart() can be used to add characters at the beginnin...

cuk0051的博客 565

Unity六边形网格A*寻路实战:从坐标转换到算法优化

寻路算法是游戏开发与AI领域的核心技术,它决定了智能体在虚拟空间中的移动决策能力。A*算法作为启发式搜索的经典实现,通过结合实际代价与预估代价,能在复杂环境中高效找到最优路径。其技术价值在于平衡了搜索效率与结果最优性,广泛应用于策略游戏、机器人导航和自动化规划等场景。在游戏开发中,六边形网格因其移动自然、邻接均衡的特性,常被用于《文明》等经典策略游戏的地图设计。本文聚焦于Unity环境下,针对尖头朝上六边形网格的A*寻路实现,深入解析了轴向坐标系的选型、邻居计算的优化策略以及地形代价的融合方法,为战棋类或策

weixin_29017445的博客 293

用java设计一个选择题_《Java语言程序设计》测试题及参考答案(第11部分)

一、选择题及参考答案1、请问以下哪些是String类中定义的方法?length()toUppper()toUpperCase()toString()equals()答案:ACDE2、请问,以下哪些有关通过子类化来扩展String类功能的描述是正确的?无法子类化,因为String类是一个final类可以子类化,通过重载String类中的方法实现功能扩展无法子类化,因为String类是一个抽象类答案:...

weixin_39569543的博客 1538

复现《水化硅铝酸钙微结构和性能的分子动力学模拟研究》的分子动力学模拟

本文详细复现了杨军博士论文中关于水化硅铝酸钙(C-A-S-H)凝胶的分子动力学模拟方法。研究内容包括:1)基于11Å Tobermorite构建C-A-S-H分子模型,通过缺陷引入和Al掺杂调节Ca/Si比;2)使用ReaxFF力场模拟交联C-A-S-H的结构与力学性能;3)采用ClayFF力场研究纳米孔道中水和离子传输行为。研究提供了完整的LAMMPS输入脚本、Python分析代码和力场参数设置,为水泥基材料纳米尺度模拟提供可复现的技术方案。

huanghm88的专栏 109

【数据分享】12.5米分辨率DEM地形数据(分省)

该数据来源于NASA地球科学数据网站(https://nasadaacs.eos.nasa.gov/),是ALOS卫星获取的高精度地形数据。该数据由于精度高,包括全省范围的数据和省内每个城市范围的数据!

JData_Engineer的博客 2172

同一个字符串hash值相同吗_图说:为什么Java中的字符串被定义为不可变的

原文地址:https://dwz.cn/zWeX9Z7k作者:Hollis文章来源:微信公众号字符串,想必大家最熟悉不过了,通常我们在代码中有几种方式可以创建字符串,比如:String s = "Hollis";这时,其实会在堆内存中创建一个字符串对象,其中保存了一个字符数组,该数组中保存了字符串的内容。上面的箭头可以理解为“存储他的引用”。当我们在代码中连续创建两个相同的字符串的时候,其实会指向...

weixin_39996035的博客 1844

断层错动和近断层地震动联合作用下软岩隧洞衬砌损伤分析

摘要 本文提出了一种基于Python的软岩隧洞衬砌损伤分析系统,重点研究断层错动和近断层地震动的联合作用效应。系统采用有限元方法建立隧洞-围岩体系模型,通过非线性动力分析评估衬砌结构损伤。研究内容包括:1)建立考虑应变软化的软岩本构模型;2)基于位错理论模拟断层错动过程;3)合成具有速度脉冲效应的近断层地震动;4)开发完整的动力响应分析流程。结果表明,所提出的方法能有效评估软岩隧洞在复杂地质条件下的抗震性能,为工程设计提供理论依据。 关键词:软岩隧洞、断层错动、近断层地震动、损伤分析、Python、有限元法

max500600的博客 845

为什么java里创建字符变量_图说:为什么Java中的字符串被定义为不可变的

图说:为什么Java中的字符串被定义为不可变的全文字数: 1200阅读时间: 3分钟8张图,看懂Java字符串的不变性字符串,想必大家最熟悉不过了,通常我们在代码中有几种方式可以创建字符串,比如:String s = "Hollis";这时,其实会在堆内存中创建一个字符串对象,其中保存了一个字符数组,该数组中保存了字符串的内容。 上面的箭头可以理解为“存储他的引用”。当我们在代码中连续创建两个相同...

weixin_29008055的博客 84

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

datagrid 保存修改后行号变了_图说:为什么Java中的字符串被定义为不可变的

字符串,想必大家最熟悉不过了,通常我们在代码中有几种方式可以创建字符串,比如:String s = "Hollis";这时,其实会在堆内存中创建一个字符串对象,其中保存了一个字符数组,该数组中保存了字符串的内容。上面的箭头可以理解为“存储他的引用”。当我们在代码中连续创建两个相同的字符串的时候,其实会指向同一个对象。因为当一个字符串被被创建的时候,首先会去这个字符串池中查找,如果找到,直接返回对该...

weixin_28953877的博客 93

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

踩坑日记1——Java字符串 == 与 equals

Java字符串 == 与equals 某天正在刷力扣,遇到一道需要判断字符串是否相等的题目,死活没找到问题所在,后来才发现是==与equals的问题 for (int i = 0; i < len; i++) { // WRONG!会始终为 false 因为两个字符串存储地址不同 // if (words[i] == word1) w1 = i; if (words[i].equals(word1)) w1 = i; ... } 推荐阅读: Hollis:图说:

weixin_44593818的博客 1646

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

图说Java:理解Java机制最受欢迎的8幅图

图说Java:理解Java机制最受欢迎的8幅图 世间总是一图胜过千万言,下面的8幅图来自于 Program Creek 的 Java教程 ,目前这是该网站最受欢迎的文章. 希望本文能帮你回顾你已经知道的那些知识。如果图片讲解的不够清晰,你可能需要阅读详细的文章或者进行搜索。 1. 字符串的不可变性(String Immutability) String s =

huangshulang1234的博客 311

[细说Java](1)图说字符串的不变性

我们用下面一组图来说明Java的不变性。 1.声明一个字符串 String s = "abcd"; s存储了字符串对象的引用。下面图片中的箭头就表示这种存储引用。 2. 将一个字符串变量赋值给另外一个字符串变量 String s2 = s; s2变量存储了同样的引用值。所以,两个变量指向同一个字符串对象。

SmartSi 2432

[图说Java]图说String的不变性

我们用下面一组图来说明Java的不变性。1.声明一个字符串String s = "abcd";s存储了字符串对象的引用。下面图片中的箭头就表示这种存储引用。2. 将一个字符串变量赋值给另外一个字符串变量String s2 = s;s2变量存储了同样的引用值。所以,两个变量指向同一个字符串对象。3. 合并字符串s = s.concat("ef");s现在存储的是新生成的字符串对象的引用。4. 总结一...

weixin_33804582的博客 95

图说 Java:理解 Java 机制最受欢迎的 8 幅图

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34121304的博客 212
上一篇: 基于微服务的软件架构模式
下一篇: Java代码到底是如何编译成机器指令的
java架构那些事
博客等级 码龄6年 6粉丝 39原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值