技术改变生活,滴水可把石穿,夯实基础,注重思维,以不变应万变。
Java中String类是不可变的。不可变类指类的实例不能被修改,一个类实例包含的所有信息在该实例创建时初始化,而且不能被修改。不可变类有很多优点,本文总结了String类被设计为不可变类的原因,从内存、同步和数据结构三方面解释了不可变的思想。
1.字符串常量池的需要
字符串常量池是方法区一块特殊的存储区域,新建一个字符串时,如果常量池中已经存在该字符串,返回已存在字符串的引用,否则创建一个新的对象。
下面的语句在堆中只创建一个字符串。
就像下面这样:
注:jdk 1.6中常量池在永久代中,jdk 1.7和jdk 1.8中常量池移在堆中。
如果一个字符串是可变的,改变字符串会导致其他引用该字符串的引用指向错误的值。
2. 缓存哈希值
Java中字符串的哈希值使用频率非常高,例如,在HashMap或HashSet中。不可变保证了哈希值总是一样的,因此不用担心会发生什么变化。这就意味着不需要每次使用的时候重新计算哈希值,这样效率更高。
在String类中,有如下代码:
3. 有利于其他对象使用
为了具体说明,请看下面代码:
这个例子中,如果String是可变的,它的值就可以发生变化,这就违背了set(set不含重复元素)的设计。当然,上面的例子仅仅是为了说明这个特点,在实际的字符串类中并没有value字段。
4. 安全
String被广泛用于,如网络连接,打开文件等。如果String是可变的,一个连接或者一个文件就会被篡改,这可能导致非常严重的安全威胁。用于连接的方法会认为连接了一台机器,而实际可能不是。可变的字符串在反射中也会引起同样的安全问题。
请看下面例子:
5.不可变对象线程安全
因为不可变对象不会被改变,所以在多线程之间可以自由地共享,这就消除了同步的要求。
总之, String设计为不可变类,高效而且安全。这也是在很多情况下,不可变类是首选的原因。
每日分享
给定一个整型数组,返回数组中和为目标值的两个数的索引,可以假定每次输入只有一个结果。
例子
给定 nums=[2,7,11,15],target=9,
因为 nums[0]+nums[1]=2+7=9
返回 [0,1]
领取专属 10元无门槛券
私享最新 技术干货