动力节点口口相传的Java黄埔军校
Java中的字符串不可变的的原因有哪些
2019-09-03 来源:动力节点

  

在java里String是不可变的。一个不可变的对象是一个简单的类,它的实例不会被修改。当一个不可变的类的实例被创建时,所有的信息已经在实例中被初始化了,而且这些信息不能被修改。 不可变的类有很多优势。本文动力节点java培训机构小编分享Java中的字符串不可变的的原因有哪些,分别从内存,同步和数据结构三个方面进行了说明。


1、字符串池


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


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


String string1 = "abcd";

String string2 = "abcd";

2.png

java-string-pool.jpeg


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



  2、缓存Hashcode


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


  在String类中,有如下代码:


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


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



  3、使其他类的使用更加方便


  为了说明这一点,请看以下代码:


HashSetset = new HashSet();

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、不可变的对象,自然是线性安全的


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


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


以上就是动力节点java培训机构小编介绍的“ Java中的字符串不可变的的原因有哪些”的内容,希望能够帮助到大家,更多精彩内容请继续关注动力节点java培训机构官网,每天会有精彩内容分享与你。


相关免费视频教程推荐


JAVA可变字符串视频教程下载:http://www.bjpowernode.com/xiazai/2513.html



开班信息

同类文章

微信搜索“动力节点Java学院“或扫二维码

关注官方微信免费领学习资料

动力节点Java培训机构,行业口碑最好的Java培训机构。

立即抢名额