小伙伴们注意了!
小编在这里给大家送上关注福利:
转发本文, 关注 + 私信小编 "资料" 即可领取小编精心准备的资料一份!
字符串在 Java 中是不可变的.
不可变类只是其实例不可修改的类.
实例中的所有信息在创建实例时初始化, 并且无法修改这些信息.
不可变类有很多优点.
本文总结了为什么字符串被设计成不可变的.
本文从内存, 同步和数据结构的角度阐述了不变性的概念.
1. 串池要求
字符串池 (String intern pool) 是方法域中的一个特殊存储区域.
创建字符串时, 如果该字符串已经存在于池中, 将返回现有字符串的引用, 而不是创建新对象.
下面的代码将只在堆中创建一个字符串对象.
它看起来是这样的:
如果字符串是可变的, 用一个引用更改字符串将导致其他引用的值错误.
2. 缓存 Hashcode
Java 中经常使用字符串的 hashcode.
例如, 在 HashMap 或 HashSet 中.
不可变保证了 hashcode 总是相同的, 这样就可以在不考虑更改的情况下将其兑现.
这意味着, 不需要每次使用 hashcode 时都计算它.
这样更有效率.
在 String 类中, 它有以下代码:
3. 促进其他对象的使用
为了使其具体化, 请考虑以下程序:
在本例中, 如果字符串是可变的, 则可以更改它的值, 这将违反 set 的设计(set 包含未重复的元素).
当然, 上面的例子只是为了演示, 在实际的 string 类中没有 value 字段.
4. 安全
字符串被广泛用作许多 java 类的参数, 如网络连接, 打开文件等.
如果字符串不是不可变的, 连接或文件将被更改, 这可能导致严重的安全威胁.
该方法认为它是连接到一台机器, 但不是.
可变字符串也可能在反射中造成安全问题, 因为参数是字符串.
下面是一个代码示例:
5. 不可变对象自然是线程安全的
因为不可变对象是不可更改的, 所以它们可以在多个线程之间自由共享.
这消除了同步的需求.
总之, 出于效率和安全性的原因, String 被设计成不可变的.
这也是通常情况下不可变类更受欢迎的原因.
最后, 想学习 Java 的小伙伴们!
转发!
转发后关注 + 私信回复:"资料" 就可以拿到一份我为大家准备的 Java 学习资料!
对 Java 感兴趣的小伙伴也可以加 小编 V: suxue java
来源: http://www.jianshu.com/p/5b1f87bcfeea