欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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
}