String的不可变和final修饰有关系嘛?为什么要被final修饰?

本文深入探讨了Java中String类的不可变性原理,解释了不可变性与final关键字的关系,以及这种设计如何保障字符串的安全性和效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

思考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
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值