美国上市公司,专注Java培训22年

为什么在Java中String被设计成不可变


java培训班导读

Java 中将 String 设计成不可变的是综合考虑到各种因素的结果,想要理解这个问题,需要综合内存,同步,数据结构以及安全等方面的考虑。在下文中,将为各种原因做一个小结。

1字符串常量池的需要

字符串常量池( String pool, String intern pool, String 保留池)

是 Java 堆内存中一个特殊的存储区域,当创建一个String对象时,假如此字符串值已经存在于常量池中,则不会创建一个新的对象,而是引用已经存在的对象。

如下面的代码所示,将会在堆内存中只创建一个实际 String 对象。

String string1 = "abcd";

String string2 = "abcd";

示意图如下所示:

为什么Java中String被设计成不可变

假若字符串对象允许改变,那么将会导致各种逻辑错误,比如改变一个对象会影响到另一个独立对象。

严格来说,这种常量池的思想,是一种优化手段。

请思考:假若代码如下所示,s1 和 s2 还会指向同一个实际的 String 对象吗?

为什么Java中String被设计成不可变

也许这个问题违反新手的直觉,但是考虑到现代编译器会进行常规的优化,所以他们都会指向常量池中的同一个对象。

或者,你可以用 jd-gui 之类的工具查看一下编译后的 class 文件。

2允许 String 对象缓存 HashCode

Java 中 String 对象的哈希码被频繁地使用,比如在 hashMap 等容器中。

字符串不变性保证了 hash 码的唯一性,因此可以放心地进行缓存。

这也是一种性能优化手段,意味着不必每次都去计算新的哈希码.。

在 String 类的定义中有如下代码:

为什么Java中String被设计成不可变

3安全性

String 被许多的 Java 类(库)用来当做参数。

例如:网络连接地址URL,文件路径path,还有反射机制所需要的 String 参数等,。

假如 String 不是固定不变的,将会引起各种安全隐患。

假如有如下的代码:

为什么Java中String被设计成不可变


【免责声明】本文部分系转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,如涉及作品内容、版权和其它问题,请在30日内与我们联系,我们会予以重改或删除相关文章,以保证您的权益!

Java开发高端课程免费试学

大咖讲师+项目实战全面提升你的职场竞争力

  • 海量实战教程
  • 1V1答疑解惑
  • 行业动态分析
  • 大神学习路径图

相关推荐

更多
  • 解读HTTP状态码
    解读HTTP状态码
    感谢大家阅读由java培训机构分享的“解读HTTP状态码 ”希望对大家有所帮助,更多精彩内容请关注Java培训官网 详情>>

    2017-10-16

  • 什么是JWT VS Session
    什么是JWT VS Session
    JSON Web Token(JWT)是一种开放标准(RFC 7519),它定义了一种紧凑且独立的方式,可以将各方之间的信息作为JSON对象进行安全传输。 详情>>

    2017-08-30

  • 为什么在Java中String被设计成不可变
    为什么在Java中String被设计成不可变
    在 Java 中将 String 设计成不可变的是综合考虑到各种因素的结果,想要理解这个问题,需要综合内存,同步,数据结构以及安全等方面的考虑。在下文中,将为各种原因做一个小结。 详情>>

    2017-07-28

  • Java项目经验——程序员成长的钥匙
    Java项目经验——程序员成长的钥匙
    感谢大家阅读本文章,本文旨在帮助更多的java同学获取一把成功的钥匙,更多精彩内容请关注java培训机构的官网 详情>>

    2017-06-16

  • Java开班时间

    收起