微知识:Java 中是怎么设计保证了 String 的不可变性?
本文发布于 2025年02月06日,阅读 69 次,点赞
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被声明为 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);
}