为什么String在Java中是不可变的

1.数据共享问题

因为String对象是缓存在String常量池中的,缓存的字符串在多个用户之间是共享的,存在风险,一个用户的修改操作会影响到其他所有用户,比如将“ABC”更改为“abc”,那么所有其他的使用者也会随之变更,所以需要String类不可变来避免这种风险。

2.作为HashMap的键

因为HashMap函数可以储存String字符串作为键,因为HashMap需要使用键经过散列函数变换得到的hashcode,去检索存储在HashMap中的值对象。
如果String是可变的,那么改变了键值,相对应的hashcode也会跟着变化,可能会丢失Map中的值对象。

3.避免参数传递安全威胁

因为在各个方法中,都会用到相对应的字符串作为参数传递,比如打开数据库连接、通过IO类打开指定文件等。
如果String是可变的,可能会被利用,可以通过改变相应字符串去访问其他受保护文件,或者更改文件访问权限等。

4.被类加载机制引用,安全考虑

其实跟第三点的考虑差不多,因为JVM在初始化的时候,会用到类加载器去加载指定的java类。
如果String能够改变,可能加载指定类的请求会在中途被更改,变成加载其他类,造成安全性问题,比如:
加载“java.io.Writer” 的请求可能已被更改为加载 “mil.vogoon.DiskErasingWriter”。

5.线程安全

由于String的不可变性,所以在多线程编程中,可以安全的共享多个线程,避免了同步问题,不用额外的去外部同步String对象。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 为什么String在Java中是不可变的是流行的面试问题之一。String是任何编程语言中最常用的类之一。Stri...
    小马哥哥阅读 3,247评论 0 0
  • 一、基础知识:1、JVM、JRE和JDK的区别:JVM(Java Virtual Machine):java虚拟机...
    杀小贼阅读 7,063评论 0 4
  • 九种基本数据类型的大小,以及他们的封装类。(1)九种基本数据类型和封装类 (2)自动装箱和自动拆箱 什么是自动装箱...
    关玮琳linSir阅读 5,960评论 0 47
  • 1.import static是Java 5增加的功能,就是将Import类中的静态方法,可以作为本类的静态方法来...
    XLsn0w阅读 5,051评论 0 2
  • 远程强制覆盖本地 1、选择项目,右键选择Team,选择Team里面的Reset。 2、点击Reset后弹出Rese...
    风的低语阅读 1,112评论 0 0

友情链接更多精彩内容