首页 > 其他 > 详细

图解String类型的不可变性及其原因

时间:2016-01-16 09:39:26      阅读:264      评论:0      收藏:0      [点我收藏+]

1.String的不可变性

String s=“abcd”;

上面的语句定义了一个字符串变量s。该变量指向字符串“abcd”,当初始化变量s时,会在堆中为s非配内容空间。例如以下图所看到的:

技术分享

当将字符串变量,赋值给还有一个字符串变量时,比如:String s2=s。

此时。s2和s是同样的字符串对象。例如以下图所看到的:

技术分享

当一个字符串连接其它字符时。他就指向了新的字符串对象,比如。s=s.concat("ef“)。 例如以下图所看到的
技术分享

当一个字符串在堆中被分配内容时,它就是不可变的,不论什么String的方法都无法改变字符串本身,但它能够返回一个新的字符串对象。

假设须要能够改动的字符串对象,能够使用StringBuffer和StringBuilder,StringBuffer是线程安全的,因为StringBuilder不须要进行同步操作,StringBuilder是比較高速的。

2.String 不可变性的原因

1)字符串池(String pool)的需求
在Java中,当初始化一个字符串变量时。假设字符串已经存在。就不会创建一个新的字符串变量,而是返回存在字符串的引用。

比如: String string1="abcd";
String string2="abcd";
这两行代码在堆中仅仅会创建一个字符串对象。

假设字符串是可变的。改变还有一个字符串变量。就会使还有一个字符串变量指向错误的值。

2)缓存字符串hashcode码的须要
字符串的hashcode是常常被使用的。字符串的不变性确保了hashcode的值一直是一样的,在须要hashcode时,就不须要每次都计算,这样会非常高效。
3)出于安全性考虑
字符串常常作为网络连接、数据库连接等參数。不可变就能够保证连接的安全性。



图解String类型的不可变性及其原因

原文:http://www.cnblogs.com/gcczhongduan/p/5134898.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!