String的不可变和final修饰有关系嘛?为什么要被final修饰?
程序员文章站
2022-03-07 22:43:13
...
思考String不可变和final修饰有关系嘛
1. 什么是不可变?
当str赋值成“world”时,不是将原来的hello修改,而是重新指向了一个新对象。
String str = "hello";
str = "world";
2. String为什么不可变?
直接上源码:
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
//{@link Stable} is safe here, because value is never null.
@Stable
private final byte[] value;
在源码中我们发现,String被final修饰,说明String不可继承。字节数组被final修饰,且提示值不为null。注意这里的被final修饰不是说字节数组不可变,说的是指向字节数组的引用地址不可变。
final byte[] str = {1,2,3,4};
byte[] tar ={5,6,7};
str = tar // 编译期报错,final不可变
如果直接对字节数组进行修改是可以的:
final byte[] str = {1,2,3,4};
str[1]=0; //{0,2,3,4}
所以在源码中private final byte[] value;
中的private的作用要比final大很多。String不可变的关键在底层的实现,而不在一个final。String类声明为final主要是为了防止被继承,也就是为了String的安全性。如果String不被final修饰,那么在String的子类中就有可能改变String的语义。
如果String可被继承,那么就会变成:
public class FuckString extends String {
private char[] chars;
public FuckString(String string) {
chars = string.toCharArray();
}
public void setChar(int index, char ch) {
chars[index] = ch;
}
public String toString() {
return new String(chars);
}
// other fucking method
}
下一篇: 深入理解PHP7内核之Reference