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

原文 Why String is immutable in Java?

在java里String是不可变的。一个不可变的对象是一个简单的类,它的实例不会被修改。当一个不可变的类的实例被创建时,所有的信息已经在实例中被初始化了,而且这些信息不能被修改。 不可变的类有很多优势。本文总结了为什么String被设计为不可变的,分别从内存,同步和数据结构三个方面进行了说明。

1. 字符串池

推荐这篇文章 Java字符串池(String Pool)深度解析

字符串池是方法区中的一个特殊存储区。当一个字符串被创建的时候,如果字符串池中已经存在这个字符串值,就直接返回已存在字符串的引用,否则,就创建一个新的字符串到字符串池中。

下面代码将只会在堆中创建一个字符串对象:

String string1 = "abcd";
String string2 = "abcd";

如图所示:

java-string-pool.jpeg

如果字符串是可变的,改变引用的字符串将会导致其他引用此字符串是错误的。

2. 缓存Hashcode

在java中经常使用字符串的哈希码。例如:在HashMapHashSet 中,字符串的不可变性,保证了哈希码是一致的,从而不必担心哈希码会改变。这意味着,每次使用哈希码都不必重新计算一次。这样,会更加高效。

在String类中,有如下代码:

private int hash;//this is used to cache hash code.

以上代码中hash变量中就保存了一个String对象的hashcode,因为String类不可变,所以一旦对象被创建,该hash值也无法改变。所以,每次想要使用该对象的hashcode的时候,直接返回即可。

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中包含了不重复的元素)。当然,以上代码仅仅是个演示,实际String类中,并没有value字段。

4.安全

在许多java类中,字符串被广泛使用为参数。比如:网络连接,打开文件等。如果字符串是可变的,则一个连接或文件将被更改,这可能会导致严重的安全威胁。该方法认为它连接到一台机器,但可能并没有。可变的字符串可能在反射中也会造成安全问题,因为它的参数是字符串。

代码示例:

boolean connect(string s){
    if (!isSecure(s)) { 
    throw new SecurityException(); 
    }
        //here will cause problem, if s is changed before this by     using other references.    
        causeProblem(s);
}

5.不可变的对象,自然是线性安全的

因为不可变对象不能被更改,因此可以在多个线程之间自由共享。不需要任何同步处理。

总之,把字符串设计成不可变的,主要目的是为了高效和安全。这也是为什么许多情况下更偏爱选择不可变的类的原因。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 34,745评论 18 399
  • 一、Java 简介 Java是由Sun Microsystems公司于1995年5月推出的Java面向对象程序设计...
    子非鱼_t_阅读 4,564评论 1 44
  • 注:都是在百度搜索整理的答案,如有侵权和错误,希告知更改。 一、哪些情况下的对象会被垃圾回收机制处理掉  当对象对...
    Jenchar阅读 3,312评论 3 2
  • 还记得大二那年某天专业课的下午,你给我推荐了逃跑的一万次悲伤,第一句就把我听哭了,那个时候已经互相熟悉了,...
    莉莉安1992阅读 407评论 0 0
  • 或许那一声声的想你是他最后的勇气 她是一个可以称得上死党的朋友,他呢,则是和死党差不多高的小伙伴。刚开始,并不清楚...
    帅气的张大侠阅读 770评论 5 3

友情链接更多精彩内容