起航学习网

- 让每个人都能学到最前沿新知识、新技能!
起航学习网
当前位置: 起航学习网 > 短期培训 > 编程语言 > 为何在Java中String被设计成不可变

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

时间:2021-07-29 15:16:10来源:Java开发培训网 作者:Java开发教程网 已有: 名学员访问该课程

前言: Java开发培训班导读 在 Java 中将 String 设计成不可变的是综合考虑到各种因素的结果,想要理解这个问题,需要综合内

Java开发培训班导读

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

1字符串常量池的需要

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

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

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

String string1 = "abcd";

String string2 = "abcd";

示意图如下所示:


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

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

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

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

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

2允许 String 对象缓存 HashCode

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

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

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

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

3安全性

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

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

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

假如有如下的代码:

文章出自:http://qh.itpxw.cn/peixun/software/202190907.html

文章标题:为何在Java中String被设计成不可变



免责声明:本站文章均由入驻起航学习网的会员所发或者网络转载,所述观点仅代表作者本人,不代表起航学习网立场。如有侵权或者其他问题,请联系举报,必删。侵权投诉

(责任编辑:深圳学历教育网)
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
培训学校
IT培训网 访问该机构站点 报名留言 加为好友 用户等级:注册会员 用户级别:10 机构名称:IT培训网 联 系 人:罗老师 联系电话:13783581536 联系手机:13783581536 在线客服:起航学习网客服 在 线 QQ:起航学习网客服 电子邮件: 网站域名:http://www.itpxw.cn 注册时间:2016-07-18 11:07 最后登录:2024-02-20 13:02
推荐内容