为什么String类是不可变的

技术改变生活,滴水可把石穿,夯实基础,注重思维,以不变应万变。

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]

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180615G21BKK00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券