首页 > 其他分享 >String类为什么是不可变的,为什么用final修饰?

String类为什么是不可变的,为什么用final修饰?

时间:2024-11-20 21:49:39浏览次数:3  
标签:为什么 String str1 哈希 字符串 可变性 final

曾经,在学习的途中,我时常感到疑惑,那就是String的不可变。

首先,什么是不可变呢,例子如下:

public class ImmutableExample {
    public static void main(String[] args) {
        String str1 = "Hello";
        String str2 = str1.concat(" World");
        System.out.println(str1); // 输出:Hello
        System.out.println(str2); // 输出:Hello World
    }
}

在这个例子中,str1 的值始终是 “Hello”,即使调用了 concat 方法,也不会改变 str1,而是返回了一个新的字符串 str2。

那么,我有了疑问,它为什么是不可变的呢?为什么要有这样一个不可变的类在Java中存在呢,它存在的目的是什么?

答案是:String 类使用 final 修饰是因为 Java 设计者希望 String对象具有不可变性(immutability)。将 String 类声明为 final,可以确保其不可被继承,从而实现它的不可变性,进而带来了安全性、性能和多线程环境下的优点。

不可变性(Immutability)

String 对象一旦创建,就不能更改其内容。不可变性意味着字符串的内容在创建后是固定的,不会被改变。这样设计的原因包括:

  • 安全性:不可变的 String 对象在系统中被广泛使用,如文件路径、网络连接等。因为不可变性,它们不会被修改,可以安全地作为==关键值(如哈希表的键)==使用。
  • 线程安全String 的不可变性使得它在多线程环境下是安全的,不会出现线程修改字符串值的问题。

哈希缓存

String 类通常用作哈希表的键。为了优化性能,StringhashCode 值会在创建时计算并缓存,以便后续使用。因此,String 的不可变性保证了 hashCode 的值不会改变,否则可能导致哈希值变化,出现哈希表查找失败的情况。

安全性(Security)

在许多安全操作中,String 类经常用于存储敏感信息,如用户名、密码、网络地址等。若字符串可变,可能导致这些信息在执行过程中被恶意修改,带来安全隐患。不可变的 String 能确保这些数据的完整性和安全性。

字符串池(String Pool)优化

Java 采用字符串池技术来优化内存使用,当创建一个字符串时,会首先检查字符串池中是否已存在该字符串,如果存在则复用已有的字符串实例,不会再创建新的对象。由于字符串是不可变的,多个引用可以安全地指向同一个字符串实例,从而减少内存开销。

禁止继承(final 类的设计目的)

如果 String 不是 final 类,那么它可以被继承,而子类可能会改变其不可变性,这样就破坏了 String 不可变的设计初衷。因此,final 修饰可以防止其他类修改 String 的行为。

总结来说,String 类使用 final 修饰确保了它的不可变性、线程安全性和内存使用效率,使其在 Java 应用中更加安全和高效。

标签:为什么,String,str1,哈希,字符串,可变性,final
From: https://blog.csdn.net/weixin_47510148/article/details/143926245

相关文章

  • Linux使用finalshell连接的时候断开或者直接连接不上
    学习Linux这段时间,finalShell总是突然连接不上主机头几次出现这种情况的时候,我把主机重启,finalshell再打开突然就能连上了后边再出现的时候,我直接尝试重新连接,又能连接上了之后再次断开后,尝试多次重启重连都不行了,开始搜帖子找问题解决问题第一次,我在社区搜索很多帖子,发现有个......
  • 为什么黑客圈几乎一片男生?零基础入门到精通,收藏这篇就够了
    在一个全球顶尖的黑客大会上,人群熙熙攘攘,但一眼望去,却少有女性的身影。少数的女性黑客穿梭在各个展台间,显得格外醒目。许多技术设备与工具的演示台前,几乎都是年轻男性在仔细研究。这种场景在许多科技活动中早已屡见不鲜,背后原因值得我们探讨:为什么黑客领域总是男性主导,女性......
  • 为什么你的工作总是越忙越乱?答案可能出乎意料!
    信息过载与任务混乱:现代职场的隐形敌人信息洪流对现代工作的挑战在现代社会,无论个人还是团队,几乎每天都要面对海量的信息。邮件、聊天工具、项目需求文档,甚至口头传递的信息,都让我们感到“时间不够用,信息处理不过来”。这种现象在企业和团队中尤为严重:信息分散:工作事项分布在......
  • 我为什么要舍弃CSDN改用博客园
    作为博客园老用户,我希望更加积极的在博客园分享技术而非CSDN,因为CSDN没有开放性,什么都要审核着实很烦!下面是我在CSDN十余年耕耘,仅收获了一堆无用的破勋章和一万多粉丝,因为不怎么回消息答疑铁粉很少。下面是我跟CSDN在线客服的对话:  下面是客服回复给我的原文:抱歉我们......
  • 最深层的秘密是, 生活不是发现的过程,而是创造的过程。 你并不是在发现自我,而是在创造自
    最深层的秘密是,生活不是发现的过程,而是创造的过程。你并不是在发现自我,而是在创造自我。因此,别试图解答你是什么人,要试图确定你想成为什么人。这句话富有哲理,蕴含着深刻的人生智慧。它表达了一种积极的生活态度:人生不是被动地等待或“发现”一个注定的自我,而是主动地塑造和......
  • 为什么选择EverEdit
     1为什么选择EverEdit  世面上文本编辑器各类繁多,开源免费的编辑器更是多不胜数,既然有这么多免费的替代品,为什么还要使用付费的EverEdit?  免费文本编辑器的顶流:神的编辑器(Emacs)、编辑器的神(Vim),这些都是非常不错的文本编辑器,但你会发现,日常工作中,使用这两款编辑......
  • 什么是OA办公系统?为什么OA办公系统对于企业的作用越来越重要?
    如何提升工作效率、优化资源配置、加强团队协作能力,成为了每个企业管理者亟需解决的关键问题。随着企业规模的扩展和业务流程的复杂化,传统的手工操作和纸质文件已经无法满足高效办公的需求。OA(OfficeAutomation)办公系统应运而生,成为了现代企业提高工作效率、优化管理流程、实现......
  • [Java] String的hashCode方法
    简述java/lang/String#hashCode是用途极广的方法,其源码实现也存在一定变迁。其位于JRE的rt.jar包内OpenJDKOpenJDK8-b120版~9-b00版:=OracleJDK1.8.0-261jdk/jdk/src/share/classes/java/lang/String.javahttps://github.com/openjdk/jdk/blob/jdk8-b120/......
  • STM32(hal库)中,为什么DMA没有MSP函数?
            在STM32HAL库中,DMA(直接存储器访问)并没有像其他某些外设(如USART、SPI等)那样拥有专门的MSP(MCUServicesPackage)初始化函数,这主要是由于DMA的特性和HAL库的设计哲学所决定的。        首先,需要明确的是,MSP函数通常是由STM32CubeMX工具为特定的外设生成......
  • 继承,方法重写,supper,final,访问修饰符 ,根类Object
    1.继承继承可以使得子类具有父类的属性和方法或者重新定义、追加属性和方法等。如果某类B“继承”另某类A,就把这个B称为“A的子类或派生类(subclass)”,而把类A称为“B的父类”也可以称为“A是B的超类或基类(superclass)为什么需要继承1.提供代码的可重用性;2.起到扩展作用。语......