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

String 字符串不可变带来的好处是什么?

目录

一. 线程安全(数据安全)

二. 节约内存

三. 提高集合的存取效率


一. 线程安全(数据安全)

众所周知,String 字符串是默认被 final 修饰的,是不可变的,那么首先能想到的一个优点就是线程安全,String 是存放在堆中的,是所有线程所共享的变量,不可变这一特性就可以在多线程的情况下防止出现一个线程对 String 做修改导致另一个线程运行结果出现错误。

举个最简单的例子,A线程和B线程都用到了字符串 s,假如说A线程把 s 做了修改,那么B线程就会因为A做的修改而被迫受到影响,这一点是非常不好的。

二. 节约内存

String 虽然是不可变的,但它却可以重复利用。String 虽然是在堆中,但其实分为两种情况,如果我们使用 String string = "xxx" 的方式来创建字符串,那么被创建出来的字符串对象是存放在堆中的字符串常量池中的,可以重复利用;假如我们使用 String string = new String("xxx") 的方式来创建字符串,那么被创建出来的对象是直接存放在堆中的,无法重复利用。

我用一段代码举例同学们一下子就懂了。

public static void main(String[] args) { String str1 = "abcdefg"; String str2 = "abcdefg"; String str3 = new String("abcdefg"); System.out.println(str1 == str2); System.out.println(str1 == str3); System.out.println(str2 == str3); }

运行上述代码,得到如下结果

可以看到,str1 和 str2 都是直接赋值,其实指向的是堆中的同一个字符串对象,运算结果为 true;

而 str3 则是使用 new 对象的方式赋值,并不会引用常量池中已有的 abcdefg 而是会重新在堆中新建一个再指向新的,所以后两次运算都为 false;

所以说,String 虽然不可变,却可以重复利用,在开发过程中,几乎都是使用 String str = "xxx" 创建字符串,然后创建的字符串会被缓存到堆中的字符串常量池中,在同一各项目中不管有多少个人创建字符串,只要字符串内容一样,其实最后都是用的常量池中的同一个字符串对象,大大的降低了内存的消耗。

三. 提高集合的存取效率

上面说到了字符串常量池,同学们也可以理解为缓存池,在缓存池中,不仅缓存了字符串的内容,还缓存了每一个字符串对应的哈希值hashCode。当我们使用 Map 集合存取数据的时候,因为 Map 集合的 Key 基本都是 String 类型,所以在存和取数据的时候,就不需要重复哈希值,直接去缓存池中找就可以,找不到才会去计算。这样一来就极大地提高了 Map 集合存取数据的效率。

http://www.jsqmd.com/news/1242147/

相关文章:

  • 选择器分类和权重计算,less 中的 解释
  • Tiva C系列MCU深度睡眠模式下的时钟门控与电源管理实战
  • HarmonyOS 6.1 实战:Navigation 路由组件全面解析
  • 麒麟信安“一云多芯”解决方案,助力传统IT架构变革转型
  • HDI综合效益优势-平衡小型化、迭代效率与长期量产成本
  • VirtualLab Fusion中的光学各向异性介质
  • Java面试之Linux和docker
  • TikTok广告投放多少钱?2026年最新投放成本与防关联指南
  • Instagram新功能倾向创作者,普通用户与创作者需求如何平衡?
  • [SPI]SPI接口简介
  • SARS-CoV-2病毒:从分子结构到全球大流行的全面解析
  • 嵌入式系统ROM代码执行与片上调试全解析:从启动到调试的底层实践
  • Cortex-M4系统控制与异常处理寄存器深度解析:从原理到实战
  • 绿幕发灰、边缘闪烁、头发丝丢失?Runway抠像失败的7个隐性参数陷阱,今天必须改!
  • 官宣,麒麟信安服务器操作系统V3.4-5正式发布
  • SATA控制器架构深度解析:从AHCI原理到嵌入式开发实践
  • PS5 NOR Modifier:终极方案解析,如何修复损坏的PS5 NOR闪存文件
  • 【AI副业口碑裂变公式】:3个被低估的传播杠杆,90%从业者从未用过
  • 大气湍流下的少模光纤耦合
  • HarmonyOS 6.1 实战:GridRow/GridCol 响应式栅格布局详解
  • 2026留学生找工作平台评测:靠谱平台推荐与选型攻略 - 极欧测评
  • torch.distributed的通信原语选择:all_reduce、all_gather与reduce_scatter
  • Orin 上开机自启跑检测docker容器(含完整脚本)
  • TMS320C6424 DSP外设实战:PWM、VLYNQ、GPIO与JTAG深度配置指南
  • 代码不是 AI 编程的最终资产,AI Coding 真正该存的是 Checkpoint
  • 深入解析C2000 SCI模块:中断、DMA与低功耗模式实战指南
  • 鸿蒙Flutter push与pop操作:页面跳转与返回基本操作
  • 浅谈 MySQL 主从复制,优点?原理?
  • HarmonyOS应用开发实战:萌宠日记 - 活动横幅卡片设计
  • html之flex伸缩盒子;grid布局