美文网首页
String类型为什么设计成不可变的?

String类型为什么设计成不可变的?

作者: 善思者_tin | 来源:发表于2020-02-13 16:39 被阅读0次

    一、概述

    String是java开发使用最多的类,String类位于java.lang包下,是Java语言的核心类,提供了字符串的比较、查找、截取、大小写转换等操作;部分源码如下

    从上面可以看出

    (1)String类被final关键字修饰,意味着String类不能被继承,并且它的成员方法都默认为final方法;字符串一旦创建就不能再修改。

    (2)String类实现了Serializable、CharSequence、 Comparable接口。

    (3)String实例的值是通过字符数组实现字符串存储的。

    今天主要分析String为什么要被设计成不可变类。

    二、什么是不可变对象

    从字面意思也能够理解,也就是我们的创建的对象不可改变。那什么是不可变呢?为了实现创建的对象不可变,java语言要求我们需要遵守以下5条规则:

    (1)类内部所有的字段都是final修饰的。

    (2)类内部所有的字段都是私有的,也就是被private修饰。

    (3)类内部的字段如果是引用,也就是说可以指向可变对象,那我们程序员不能获取这个引用。

    (4)类不能够对外提供哪些能够修改内部状态的方法,setter方法也不行。

    (5)类不能够被继承和拓展。

    以上是从类本身,类内部的字段修饰,类方法来进行剖析。正是由于我们的String类型遵循了上面5条规则,所以才说String对象是不可变的。

    三、JAVA语言为什么把String类型设计成不可变

    这里有几个特点。

    设计为不可变,都是基于安全性的角度考虑。

    第一:在Java程序中String类型是使用最多的,这就牵扯到大量的增删改查,每次增删改差之前其实jvm需要检查一下这个String对象的安全性,就是通过hashcode,当设计成不可变对象时候,就保证了每次增删改查的hashcode的唯一性,也就可以放心的操作。

    例如:网络连接地址URL,文件路径path通常情况下都是以String类型保存, 假若String不是固定不变的,将会引起各种安全隐患。就好比我们的密码不能以String的类型保存,如果你将密码以明文的形式保存成字符串,那么它将一直留在内存中,直到垃圾收集器把它清除。而由于字符串被放在字符串缓冲池中以方便重复使用,所以它就可能在内存中被保留很长时间,而这将导致安全隐患。还比如字符串值是被保留在常量池中的,也就是说假若字符串对象允许改变,那么将会导致各种逻辑错。

    相关文章

      网友评论

          本文标题:String类型为什么设计成不可变的?

          本文链接:https://www.haomeiwen.com/subject/ksehfhtx.html