【第22期】观点:IT 行业加班,到底有没有价值?

为什么Java中的String是不可变的?

翻译 2015年11月19日 13:36:19

原文:Why String is immutable in Java ?
翻译:get-set


String是Java中的一个不可变类。所谓不可变,简单来说就是其对象不能被修改。实例中的所有信息在初始化的时候就已经具备,并且不能被修改(老外好啰嗦…)。不可变类有很多优点。这篇文章简要说明了为什么String被设计为不可变类。关于其好的回答应该建立在对内存模型、同步和数据结构等的理解之上。

1. 字符串池的需求

字符串池是一个位于方法区的特殊区域。当一个字符串被创建的时候,如果该字符串已经存在于字符串池中,那么直接返回该字符串的引用,而不是创建一个新的字符串。
下边的代码将只会创建一个字符串对象:

String s1 = "abcd";
String s2 = "abcd";

就不上图了,这块的内容前一篇翻译的文章已经解释过了。也就是s1s2都指向同一个字符串对象。
如果String不是不可变的,那么修改s1的字符串对象同样也会导致s2的内容发生变化。

2. 缓存Hashcode

字符串的hashcode在Java中经常被用到。例如,在一个HashMap中。其不可变性保证了hashcode(哈希值)总是保持不变,从而不用担心因hashcode变化导致的缓存问题。那就意味着,不用每次在其使用的时候计算其hashcode,从而更加高效。
String类中,有如下代码:

private int hash; //用来缓存hash code

3. 简化其他对象的使用

为了理解这一点,请看下边的代码:

HashSet<String> set = new HashSet<String>();
set.add(new String("a"));
set.add(new String("b"));
set.add(new String("c"));
for (String a : set)
    a.value = "a";

这个例子中,如果String是可变的,也就是说set中的值是可变的,这会影响到set的设计(set包含不重复的元素)。当然这个例子是有问题的,在String类中是不存在value这个属性的。

4.安全性

字符串在许多的java类中都用作参数,例如网络连接,打开文件等等。如果字符串是可变的,一个连接或文件就会被修改从而导致严重的错误。可变的字符串也会导致在使用反射时导致严重的问题,因为参数是字符串形式的。
举例如下:

boolean connect(String s) {
    if (!isSecure(s)) {
        throw new SecurityException();
    }
    // 如果s内的值被修改,则会导致出现问题
    doSomethind(s);    
}

(虽然略牵强,但是也有一定道理)

5. 不可变的对象本身就是线程安全的

不可变的对象,可以在多个线程间自由共享。从而免除了进行同步的麻烦。

总之, String被设计为不可变的类,是出于性能和安全性的考虑,这也是其他所有不可变类应用的初衷。


举报

相关文章推荐

Java中的String为什么是不可变的? -- String源码分析

什么是不可变对象? 众所周知, 在Java中, String类是不可变的。那么到底什么是不可变的对象呢? 可以这样认为:如果一个对象,在它创建完成之后,不能再改变它的状态,那么这个对象就是不可变的。不...

java中String类为什么要设计成不可变的

1.什么是不可变? String不可变很简单,如下图,给一个已有字符串“abcd”第二次赋值成"abced",不是在原内存地址上修改数据,而是重新指向一个新对象,新地址。 2.String为什么不...

深入理解String为什么是不可变的类

如上图所示 String s1="abcd" ;    等价于  String s1=new String("abcd"); 两个变量都指向同一个堆内存 String s="abcd";...

在java中,String为什么是不可变的类?

1.”不可变的一个例子”给一个已有字符串”abcd”第二次赋值成”abcedl”,不是在原内存地址上修改数据,而是重新指向一个新对象,新地址。

为什么String在Java中是不可变的

String在Java中是不可变类。一个不可变类简单来讲就是它的实例不可被修改。一个实例的所有信息在这个实例被创建时就被初始化,然后这些信息不能被修改。不可变类有很多优点。这篇文章介绍为什么Strin...

Java的string类为什么是不可变的?

这篇文章主要介绍了Java的string类为什么是不可变的,总结了三个答案,需要的朋友可以参考下 答案一: 最流行的Java面试题之一就是:什么是不可变对象(immutable object),...

String变量为什么是不可变的?

String

为什么String类型是不可变的?

这篇文章将对字符串的驻留做详细的解释和剖析。  引自:http://www.programcreek.com/2013/04/why-string-is-immutable-in-java/ 鉴于个人...

为什么字符串在Java中是不可变的?

这是一个古老但仍然流行的问题。Java中字符串被设计成不可变的,有多种原因。很好的答案取决于你对内存,同步,数据结构等更好的理解,下面,我总结一些答案。 1.String Pool中的要求 字...

Java的string类为什么是不可变的

答案一: 最流行的Java面试题之一就是:什么是不可变对象(immutable object),不可变对象有什么好处,在什么情况下应该用,或者更具体一些,Java的String类为什么要设成immu...
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)