介绍
Java中是怎么设计保证了String
的不可变性?
1.String
类被声明为 final
在 Java 中,String类被声明为 final,这意味着它不能被继承。如果String类可以被继承,那么子类可能会重写String类的方法,从而破坏其不可变性。
ts
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence,
Constable, ConstantDesc {
...
}
2.内部字符数组value
被声明为 private
和final
String
类内部使用一个private final
的字符数组value
来存储字符串的字符序列。private
修饰符确保该数组不能被外部直接访问,final
修饰符确保该数组的引用不能被重新赋值。
ts
@Stable
private final byte[] value;
3.没有提供修改字符数组的公共方法
String
类没有提供任何公共方法来直接修改内部的字符数组 value
。当调用 String
类的方法时,例如 substring
、concat
等,它们会返回一个新的 String 对象
,而不是修改原对象。
ts
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);
}