String为何称为不可变类

什么是不可变类

不可变类:所谓的不可变类是指这个类的实例一旦创建完成后,就不能改变其成员变量值。如JDK内部自带的很多不可变类:Interger、Long和String等。
可变类:可变类就是该类生成的实例的成员变量等是可以被改变的,大多数类基本都是可变类。

不可变类的优势

不可变类最大的优势就是线程安全,因为触发线程不安全就是当一个变量是共享变量的时候,有多个线程同时访问该变量,并且去修改,则就会触发线程不安全。而不可变类由于内容已经不可变,只能读取,所以就不会出现线程安全问题。

不可变类的设计原则

  • 类必须是final型的,防止被继承
  • 类里面的成员变量是final型的,防止被修改,并且是private
  • 成员变量不能暴露setter()方法,只暴露get()方法,防止被修改
  • 通过构造函数初始化成员变量
  • 成员变量的get方法,最好返回该变量的拷贝,防止变量外泄

String为何是不可变类

String的源码如下:

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    /** The value is used for character storage. */
    private final char value[];

    /** Cache the hash code for the string */
    private int hash; // Default to 0

    /** use serialVersionUID from JDK 1.0.2 for interoperability */
    private static final long serialVersionUID = -6849794470754667710L;

    /**
     * Class String is special cased within the Serialization Stream Protocol.
     *
     * A String instance is written into an ObjectOutputStream according to
     * <a href="{@docRoot}/../platform/serialization/spec/output.html">
     * Object Serialization Specification, Section 6.2, "Stream Elements"</a>
     */
    private static final ObjectStreamField[] serialPersistentFields =
        new ObjectStreamField[0];

    public String(String original) {
        this.value = original.value;
        this.hash = original.hash;
    }    

    void getChars(char dst[], int dstBegin) {
        System.arraycopy(value, 0, dst, dstBegin, value.length);
    }
    /** ......*/
}

可以看到,String的源码里面有很多个不可变的特点

  • 类被final修饰,不会被继承
  • 成员变量都用final以及private修饰,表示一经初始化,就不会被改变
  • 源码里面没有暴露对成员变量的setter方法
  • 对于getter方法,如上面的getChars方法,返回的是copy后的值
  • 在构造函数就对成员变量进行初始化
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 34,624评论 18 399
  • 钱钟书曾对他的学生说: 不要嫁给天才,嫁给天才是很苦的。 此中滋味怕是没有人比谢烨更了解了。 谢烨曾经和友人聊起自...
    芬克阅读 35,396评论 6 9
  • 山水间是你一舞 再也移不开眼 繁华尽 无声语 万物多怜 唯你可见 冥冥间 情绪因你而变 你翩若惊鸿 出现在我的梦里...
    云水未风阅读 349评论 0 2
  • 如何培养你的自尊自信? 做难事 每天早上4点起床 很难 起床第一件事跑步 很难 晚上一个人加班或者写作很难 去陌生...
    勇敢菇阅读 322评论 0 1

友情链接更多精彩内容