
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
深圳达内培训 专注IT职业教育15年,已帮助40万名学员成功就业。目前,已开设19大课程方向,在全国51个城市建立了160家培训中心,深圳it培训0基础0元试学入学, 申请7天免费试听,深圳达内培训,真正零基础入学,无时间限制 学会为止,先就业再付款,120天=2年工作经验。
在 Java 中将 String 设计成不可变的是综合考虑到各种因素的结果,想要理解这个问题,需要综合内存,同步,数据结构以及安全等方面的考虑。在下文中,将为各种原因做一个小结。
1字符串常量池的需要
字符串常量池( String pool, String intern pool, String 保留池)
是 Java 堆内存中一个特殊的存储区域,当创建一个String对象时,假如此字符串值已经存在于常量池中,则不会创建一个新的对象,而是引用已经存在的对象。
如下面的代码所示,将会在堆内存中只创建一个实际 String 对象。
String string1 = "abcd";
String string2 = "abcd";
示意图如下所示:
假若字符串对象允许改变,那么将会导致各种逻辑错误,比如改变一个对象会影响到另一个独立对象。
严格来说,这种常量池的思想,是一种优化手段。
请思考:假若代码如下所示,s1 和 s2 还会指向同一个实际的 String 对象吗?
也许这个问题违反新手的直觉,但是考虑到现代编译器会进行常规的优化,所以他们都会指向常量池中的同一个对象。
或者,你可以用 jd-gui 之类的工具查看一下编译后的 class 文件。
2允许 String 对象缓存 HashCode
Java 中 String 对象的哈希码被频繁地使用,比如在 hashMap 等容器中。
字符串不变性保证了 hash 码的唯一性,因此可以放心地进行缓存。
这也是一种性能优化手段,意味着不必每次都去计算新的哈希码.。
在 String 类的定义中有如下代码:
3安全性
String 被许多的 Java 类(库)用来当做参数。
例如:网络连接地址URL,文件路径path,还有反射机制所需要的 String 参数等,。
假如 String 不是固定不变的,将会引起各种安全隐患。
假如有如下的代码:
感谢关注收藏本网站文章,希望以上内容对你有所帮助! ---深圳达内培训 15年经验,美国上市公司出品,4个月强化训练,O基础授课,教学总监亲自授课,拥有国内完整的课程体系,名企疯抢达内学员.高度专注国际前沿技术。2周免费试听,满意后付款!