当前位置: 首页 > news >正文

如何理解String的不可变性

一、缓存角度

在Java中对于字符串的处理,是利用字符串池去存储Java中的字符串,在字符串池中,俩个内容相同的字符串变量,可以从池中指向同一个对象,这样就节省了空间资源。

public class Main {public static void main(String[] args) {String str1 ="abcd";String str2 =str1;System.out.println(str1);System.out.println(str2);}
}

在上述代码中,我们能看到的是str1是赋值给了str2,实际上都指向的是池中的同一个对象。

我们在下述debug中能看到,byte数组存的都是一样的ASCLLl码值。

如果str1的内容被修改了,那么必然导致str2的内容也会变动,所以在String类中,所有关于修改字符串的方法其实本质上是new的新对象。

具体可以看这篇可变性的讲解:https://blog.csdn.net/rnnf_yyds/article/details/140599511?spm=1001.2014.3001.5501icon-default.png?t=N7T8https://blog.csdn.net/rnnf_yyds/article/details/140599511?spm=1001.2014.3001.5501所以,字符串存在于池中我就去取,不在就另开,这样大大节省空间。

二、安全性

2.1 信息安全

在后端实体类中通常有很多成员变量是String类型,这个时候,如果我们的String是可变的,那么比如像:密码,姓名,地址这样的信息就会被修改,那么这样的信息也就没有安全可言。

2.2 线程安全

当多个线程访问,能够确保字符串是安全的,线程安全就是要保证多个共享变量不被修改。当某个线程更改了值,那么会在字符串池中创建一个新的字符串,而不是修改相同的值,所以在并发环境下,字符串是线程安全的。

三、哈希键值对

当String被用作HashMap或HashSet等集合的键时,由于其不可变特性,一旦放入集合中,其哈希值就不会改变,保证了集合操作的正确性和高效性。(hashCode方法在String类中被重写,在第一次调用期间计算和缓存散列,并返回相同的值)

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • React中的无状态组件:简约之美
  • React的usestate设置了值后马上打印获取不到最新值
  • 学习日志:volatile 关键字
  • Java | 自制AWT单词猜一猜小游戏(测试版)
  • 通过vue3 + TypeScript + uniapp + uni-ui 实现下拉刷新和加载更多的功能
  • 宝塔Wordpress 插件 Redis object cache 导致内存很高 80%以上的原因和解决
  • 基于最新版的flutter pointycastle: ^3.9.1的AES加密
  • 一、C#概述
  • cordova使用vue进行开发
  • 题解:T480718 eating
  • 【思科】链路聚合实验配置和背景
  • 自动化产线 搭配数据采集监控平台 创新与突破
  • mysql 安装配置 next 按钮为什么置灰点击不了
  • 3D 渲染一个房屋需要多长时间?
  • chatglm2-6b-prompt尝试
  • 时间复杂度分析经典问题——最大子序列和
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • HTTP传输编码增加了传输量,只为解决这一个问题 | 实用 HTTP
  • JavaScript 基础知识 - 入门篇(一)
  • JavaScript设计模式之工厂模式
  • js算法-归并排序(merge_sort)
  • Mysql优化
  • passportjs 源码分析
  • Python学习笔记 字符串拼接
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • 代理模式
  • 基于游标的分页接口实现
  • 将 Measurements 和 Units 应用到物理学
  • 聊聊hikari连接池的leakDetectionThreshold
  • 悄悄地说一个bug
  • 因为阿里,他们成了“杭漂”
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • zabbix3.2监控linux磁盘IO
  • ‌前端列表展示1000条大量数据时,后端通常需要进行一定的处理。‌
  • !!java web学习笔记(一到五)
  • # 数论-逆元
  • #考研#计算机文化知识1(局域网及网络互联)
  • $forceUpdate()函数
  • (35)远程识别(又称无人机识别)(二)
  • (ZT) 理解系统底层的概念是多么重要(by趋势科技邹飞)
  • (超详细)语音信号处理之特征提取
  • (二)c52学习之旅-简单了解单片机
  • (附源码)spring boot火车票售卖系统 毕业设计 211004
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (三分钟)速览传统边缘检测算子
  • (原創) 如何讓IE7按第二次Ctrl + Tab時,回到原來的索引標籤? (Web) (IE) (OS) (Windows)...
  • (转)淘淘商城系列——使用Spring来管理Redis单机版和集群版
  • .mysql secret在哪_MySQL如何使用索引
  • .NET CORE 第一节 创建基本的 asp.net core
  • .NET Framework 4.6.2改进了WPF和安全性
  • .NET/C# 使用 #if 和 Conditional 特性来按条件编译代码的不同原理和适用场景
  • @RunWith注解作用
  • @Service注解让spring找到你的Service bean
  • [ vulhub漏洞复现篇 ] Apache APISIX 默认密钥漏洞 CVE-2020-13945