微知识: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
被声明为 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);
}