为什么String要设计成不可变的?
来源:互联网 发布:驳程序员青春 编辑:程序博客网 时间:2024/05/21 16:57
Original topic : http://www.programcreek.com/2013/04/why-string-is-immutable-in-java/
String
is an immutable class in Java. An immutable class is simply a class whose instances cannot be modified. All information in an instance is initialized when the instance is created and the information can not be modified. There are many advantages of immutable classes. This article summarizes why String
is designed to be immutable. A good answer depends on deep understanding of memory, synchronization, data structures, etc.
1. Requirement of String Pool
String pool (String intern pool) is a special storage area in Method Area. When a string is created and if the string already exists in the pool, the reference of the existing string will be returned, instead of creating a new object and returning its reference.
The following code will create only one string object in the heap.
Here is how it looks:
If string is not immutable, changing the string with one reference will lead to the wrong value for the other references.
2. Caching Hashcode
The hashcode of string is frequently used in Java. For example, in a HashMap. Being immutable guarantees that hashcode will always the same, so that it can be cashed without worrying the changes.That means, there is no need to calculate hashcode every time it is used. This is more efficient.
In String class, it has the following code:
3. Facilitating the Use of Other Objects
To make this concrete, consider the following program:
In this example, if String
is mutable, it's value can be changed which would violate the design of set (set contains unduplicated elements). This example is designed for simplicity sake, in the real String
class there is no value
field.
4. Security
String is widely used as parameter for many java classes, e.g. network connection, opening files, etc. Were String not immutable, a connection or file would be changed and lead to serious security threat. The method thought it was connecting to one machine, but was not. Mutable strings could cause security problem in Reflection too, as the parameters are strings.
Here is a code example:
5. Immutable objects are naturally thread-safe
Because immutable objects can not be changed, they can be shared among multiple threads freely. This eliminate the requirements of doing synchronization.
In summary, String
is designed to be immutable for the sake of efficiency and security. This is also the reason why immutable classes are preferred in general.
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
不可变对象对于多线程是安全的,因为在多线程同时进行的情况下,一个可变对象的值很可能被其他进程改变,这样会造成不可预期的结果,而使用不可变对象就可以避免这种情况。
当然也有其他方面原因,但是Java把String设成immutable最大的原因应该是效率和安全。
- 为什么String要设计成不可变的?
- 为什么String要设计成不可变的?
- 为什么String要设计成不可变的?
- 为什么String要设计成不可变的?
- 为什么String要设计成不可变的?
- 为什么String要设计成不可变的?
- 为什么String要设计成不可变的
- 为什么String要设计成不可变的?
- 为什么String要设计成不可变的?
- String 为什么要设计成不可变的?
- String类为什么要设计成不可变的
- 为什么Java中的String设计成不可变的?
- Java为什么把String设计成不可变的?
- JAVA基础之——为什么String要设计成不可变的?
- java中String类为什么要设计成不可变的
- 【String】为什么 Java 要把字符串设计成不可变的
- java中String类为什么要设计成不可变的
- 为什么Java的String设计为不可变的?
- ORACLE_HOME与协议适配器不可加载
- mybatis存储null到oracle报错问题
- 3.24
- 让我们一起Go(三)
- 查看并修改Oracle用户的密码(适用于10g,9i)
- 为什么String要设计成不可变的?
- eclipse的安装配置
- Leetcode|Maximum Gap
- v$session 的SERIAL# 是什么?
- 查看并修改Oracle用户的密码(适用于11g)
- 二叉树的子结构的判定
- ftrace介绍和使用
- captital
- Ubuntu14.04 更新源 方法 提升更新的下载速度