为什么String要被设置为不可变的

为什么设置为不可变的

Java 中将 String 设计为不可变的原因有多个,主要涉及到安全、效率、同步和设计哲学

缓存

在我们的JVM中,单独开辟了一个空间来存储Java字符串,就是字符串池

        

String s1="1234";
String s2="766";

我们来看一个代码片段

在JVM中,s1和s2都会表示"1234766",所以他们都会只想字符串池子里面的同一个字符串的对象

类似于这种 ,但是之所以这么做, 就是因为字符串的不可变性,如果是可变的, 我们一旦修改了s的内容, 那么对于的s2的内容也会修改, 如果说String的对象非常之多,显然不是我们想要看到的, 这当然只是一方面

安全性

         因为字符串被广泛用于许多 Java 应用程序和框架中作为参数,包括文件路径、数据库连接信息等敏感数据。如果字符串是可变的,那么一处更改可能会影响到其他依赖于此字符串的地方,这可能导致安全漏洞或数据不一致性。所以保护String类的对于提升应用程序的安全性也是很重要的。如果是可变的,那么就表示可能随时被修改,内容就完全不能相信了。

线程安全

        不可变的特性, 其而言就是线程安全的,多个线程同时访问,不会被修改, 如果被修改, 那就是另外一个对象了,天然适合多线程的场景, 釜底抽薪,不用担心数据共享问题

HashCode缓存&性能

        

        不可变字符串也有性能优势。由于其不变性,JVM 可以对字符串进行各种优化,如字符串池(String Pool),它会复用相同的字符串字面量,减少内存消耗。此外,不可变性也使得缓存字符串的哈希值成为可能,这对提高诸如 HashMap 这样的集合类的性能非常有帮助。

        不可变性保证了字符串的值不会被改变,因为hashCode在String类中被重写,以方便缓存,第一次调用时就会计算缓存列值,返回相同的值

源码中:

        private int hash;

 

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

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

相关文章

iPhone快捷指令之九宫格照片(三)

说明:这个是经过前两章的摸索,在我搞明白怎么接共享表单里的数据和会使用变量后,制作出来的终极九宫格照片指令,同一个指令在主屏幕里点击可以选择图片做九宫格图片;在相册里选择图片,点击分享按钮&#xf…

Kotlin 2.0 重磅发布! 性能提升!新功能上线!开发者必看!

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通鸿蒙》 …

C++ 关系运算

一 关系运算 二 关系运算符 三 关系表达式 四 关系表达式的值-------逻辑值 五 运算的优先级 六 注意事项 七 总结

【ai】pycharm安装github copilot解决chat一直无法初始化loading的问题

github copilot github-copilot 插件安装后:在工具里找到它 底部也有它 侧边可以chat 更新到2014.1.2copilot 也是最新但是chat 就是一直无法loading成功显示一直在初始化copilot中fix :

Python | Leetcode Python题解之第119题杨辉三角II

题目&#xff1a; 题解&#xff1a; class Solution:def getRow(self, rowIndex: int) -> List[int]:row [1, 1]if rowIndex < 1:return row[:rowIndex 1]elif rowIndex > 2:for i in range(rowIndex - 1):row [row[j] row[j 1] for j in range(i 1)]row.inser…

一、大模型推理

https://github.com/hiyouga/LLaMA-Factory/blob/main/README_zh.md https://github.com/hiyouga/LLaMA-Factory/blob/main/examples/README_zh.md 安装 v7.1 https://github.com/hiyouga/LLaMA-Factory/releases/tag/v0.7.1 git clone --depth 1 https://github.com/hiyoug…

自动化安装Nginx

1. 指定版本号和用户&#xff1b; 2. 确定安装目录&#xff1b; 3. 确定安装编译模块&#xff1b; 4. 安装相关依赖&#xff1b; 5. 下载源码包并解压&#xff1b; 6. 编译安装&#xff1b; 7. 文件授权及临时文件清理。 #!/bin/bash# 用户输入的Nginx版本号NGIN…

基于深度学习的端到端语音识别时代

随着深度学习的发展&#xff0c;语音识别由DNN-HMM时代发展到基于深度学习的“端到端”时代&#xff0c;这个时代的主要特征是代价函数发生了变化&#xff0c;但基本的模型结构并没有太大变化。总体来说&#xff0c;端到端技术解决了输入序列长度远大于输出序列长度的问题。 采…

【深度学习基础】使用Pytorch搭建DNN深度神经网络与手写数字识别

目录 写在开头 一、DNN的搭建 问题描述与数据集 神经网络搭建 模型训练 模型评估 模型复用 二、手写数字识别 任务描述 数据集 神经网络搭建 模型训练 模型评估 写在最后 写在开头 本文将介绍如何使用PyTorch框架搭建深度神经网络模型。实现模型的搭建、模…

《HelloGitHub》第 98 期

兴趣是最好的老师&#xff0c;HelloGitHub 让你对编程感兴趣&#xff01; 简介 HelloGitHub 分享 GitHub 上有趣、入门级的开源项目。 github.com/521xueweihan/HelloGitHub 这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等&#xff0c;涵盖多种编程语言 Python、…

PostgreSQL 远程登录postgres用户不需要密码?免密登录权限设置

PostgreSQL 安装之后&#xff0c;发现登录postgres用户时不需要密码。原因配置远程IP时&#xff0c;IP 地址对应的 method 设置成了 trust。 今天安全测试反馈&#xff0c;pgsql有弱口令问题&#xff0c;于是上去改了pgsql的密码&#xff0c;结果问题还没解决。查看了具体的问…

PyQt5开发笔记:1.环境搭建与界面美化

推荐视频教程&#xff1a; https://www.bilibili.com/video/BV1LT4y1e72X?p23&vd_source7ab611f3afb3d469faad93d3996f99ba 一、打开网址&#xff0c;点击下载 https://build-system.fman.io/qt-designer-download 下载后&#xff0c;点开exe 不推荐&#xff1a;http…

VSCODE 常用快捷键

快捷按键 注释 CTRL /CTRL KSHIFT ALT A取消注释 CTRL /CTRL KSHIFT ALT A搜索文件 Ctrl P移动到某一行 Ctrl g打开一个新窗口 Ctrl Shift N关闭窗口 Ctrl Shift W新建文件 Ctrl N文件间切换 Ctrl Tab全部文件搜索 Ctrl Shift F全屏 F11 打开文件出现中文乱码 文件右下角…

JavaScript的内存管理机制

No.内容链接1Openlayers 【入门教程】 - 【源代码示例300】 2Leaflet 【入门教程】 - 【源代码图文示例 150】 3Cesium 【入门教程】 - 【源代码图文示例200】 4MapboxGL【入门教程】 - 【源代码图文示例150】 5前端就业宝典 【面试题详细答案 1000】 文章目录 一、内存…

如何处理网安发出的网络安全监督检查限期整改通知

近期&#xff0c;很多客户都收到了网安发出的限期整改通知。大家都比较关心的问题是&#xff0c;如何应对处理这些限期整改通知。后续是否有其他的影响&#xff0c;需要如何做进一步的优化整改和调整。今天就这些问题给大家做一些分享。 一. 为什么会有网安的网络安全检查 主…

Linux--线程的分离、线程库的地址关系的理解、线程的简单封装(二)

线程系列&#xff1a; 线程的认识&#xff1a;讲解线程的概念和线程的基本控制 线程的分离 线程分离是指将一个线程从主线程中分离出来&#xff0c;使其能够独立运行。当一个线程被设置为分离状态时&#xff0c;它结束时系统会自动回收其资源&#xff0c;而不需要其他线程使用…

7-12 十六进制数字判断(is_hex)---PTA实验C++

一、题目描述 本题的任务是编写函数来判断字符是否可作为十六进制数字 // 这这这也太水了吧&#xff1f;十六进制数字就是[0-9A-Fa-f]嘛。 输入规格 输入由多组数据构成。 每组数据开头有一个非负整数N表示后续数据的行数&#xff0c;然后换行。之后有N行字符串&#xff0c…

【Unity Shader入门精要 第12章】屏幕后处理效果(一)

1. 原理和过程 屏幕后处理是绑定摄像机的&#xff0c;通过抓取当前摄像机渲染的图像作为 SrcTextrue&#xff0c;然后按需依次调用处理接口&#xff0c;对 SrcTexture 进行处理&#xff0c;最后将处理完成的 DstTexture 显示到屏幕上&#xff0c;整个过程的调度通过 C# 脚本完…

上弦外媒新闻发稿:2024年度国外主流新闻媒体和海外媒体软文分发平台有哪些?

2024年度主流海外媒体新闻发稿和海外媒体软文分发平台有很多&#xff0c;下面是一些常见的和广受认可的平台&#xff1a; 主流新闻媒体 CNN - 美国知名新闻网络&#xff0c;覆盖广泛的国际新闻。BBC - 英国广播公司&#xff0c;提供全球新闻和深入报道。纽约时报 - 美国主流报…

解决docker容器: bash: ping: command not found, 并制作镜像

一. 出现原因 从 dockerhub 拉下来的镜像都是最轻量级的, 不会安装各种工具, 所以使用 ping, vim 等命令, 会出现 command not found 二. 解决方式 2.1 安装工具包 进入到一个正在运行的容器内部, 执行命令: apt-get update 之后会发现, 容器正在更新软件包, 不过最终会由…