跳转到主要内容

Java 中是怎么设计保证了 String 的不可变性?

Avatar emanjusaka
统计中…
148
0
Java 中是怎么设计保证了 String 的不可变性?

作者:毅念安(Inian / Emanjusaka)|原创,后续会更新修正,转载请保留原文链接。
📝 独立博客:https://www.emanjusaka.com|博客园:https://www.cnblogs.com/emanjusaka|公众号:毅念安

1、String类被声明为final

在 Java 中,String类被声明为 final,这意味着它不能被继承。如果String类可以被继承,那么子类可能会重写String类的方法,从而破坏其不可变性。

public final class String  
    implements java.io.Serializable, Comparable<String>, CharSequence,  
               Constable, ConstantDesc {
               ...
               }

2、内部字符数组value被声明为 private和final

String类内部使用一个private final的字符数组value来存储字符串的字符序列。private修饰符确保该数组不能被外部直接访问,final修饰符确保该数组的引用不能被重新赋值。

@Stable  
private final byte[] value;

3、没有提供修改字符数组的公共方法

String 类没有提供任何公共方法来直接修改内部的字符数组 value。当调用 String 类的方法时,例如 substring、concat 等,它们会返回一个新的 String 对象,而不是修改原对象。

public String substring(int beginIndex, int endIndex) {  
    int length = length();  
    checkBoundsBeginEnd(beginIndex, endIndex, length);  
    if (beginIndex == 0 && endIndex == length) {  
        return this;  
    }  
    int subLen = endIndex - beginIndex;  
    return isLatin1() ? StringLatin1.newString(value, beginIndex, subLen)  
                      : StringUTF16.newString(value, beginIndex, subLen);  
}

本文由 emanjusaka 创作,发表于 www.emanjusaka.com,采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。

❋

微信扫码分享

微博
点赞是美意,赞赏是鼓励。如有帮助,可以关注下微信公众号。
微信 微信
支付宝 支付宝
查看赞赏名单 →
评论
← 上一篇 hutool的BeanUtil.copyProperties配置忽略空值 下一篇 → Java 常量折叠