String不可变?final修饰的变量不能变?
程序员文章站
2022-07-14 11:27:45
...
以下都是个人见解,如果有错误,希望能指出来,我会修改的。
【final】可修饰类,方法,变量。
如果修饰类,则该类无法被继承。
如果修饰方法,改方法无法被重写。
如果修饰的是变量,基本数据类型无法被赋予其他值;引用数据类型无法指向其他对象。但是指向对象的值是可以改变的。(例如我只能指向蛋糕店,不能指向其他地方,但是今天可以在蛋糕店吃蛋糕,明天也可以在蛋糕店吃面包,对象的值是可以改变的)
【不可变】是指双引号内的字符串一旦创建就不可改变。
例如:
// String s1="abc";
//s1="123";
这里,创建了对象“abc”,而"abc"一旦创建,就会在字符串常量池里,永远不会改变。而s1可以指向其他变量。改变的是s1保存的内存地址。
【String为什么不可变】在JDK14 java.lang.String 源码。
如下:
// String码源 其中的片段
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence,
Constable, ConstantDesc {
@Stable
private final byte[] value;
String被final修饰,说明该类不可继承。
byte[] value被final修饰,说明value的引用在创建之后不能被改变。
// String s="abc";//以该代码为例,简单谈一下我个人的理解。
简单来说,解释Spring不可变就是解释"abc"是"abc",而无法变成"abcd"。
注意:是指"abc"字符串本身永远无法改变,不是指s永远指向"abc"。
①首先创建了一个byte[] 数组,把"abc"放入数组。数组一旦创建,类型和长度无法改变。
②value被final修饰,value是引用,value所指向的内存地址不可变(永远指向"abc"所在的byte[]数组),不可以指向其他对象。
三,value被private修饰,只能本类访问,无法被子类,同包等外部程序直接访问访问。
④有了保护性拷贝,不允许直接赋值给数组byte[],所以数组存储的是"abc"无法改变值。
【总结】value指向地址无法改变,指向地址的对象类型无法改变,长度无法改变,对象的值无法改变。所以String是不可变的。
由于本人入门较晚,水平有限,如果有错误希望大佬能指出,为了照顾广大初学者,尽量解释的浅显易懂一些,十分感谢。