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

本文发布于 2025年02月06日,阅读 7 次,点赞 0 次,归类于 微知识

博客:https://www.emanjusaka.com
博客园:https://www.cnblogs.com/emanjusaka
公众号:emanjusaka的编程栈

1、String类被声明为final

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

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

2、内部字符数组value被声明为 privatefinal

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

@Stable  
private final byte[] value;

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

String 类没有提供任何公共方法来直接修改内部的字符数组 value。当调用 String 类的方法时,例如 substringconcat 等,它们会返回一个新的 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);  
}
本篇完