龙空技术网

什么是 String 的不可变

多肉与月季 169

前言:

现在各位老铁们对“为什么string可以直接赋值”大约比较珍视,姐妹们都想要了解一些“为什么string可以直接赋值”的相关知识。那么小编也在网摘上搜集了一些有关“为什么string可以直接赋值””的相关资讯,希望姐妹们能喜欢,看官们快快来学习一下吧!

首先我们先来看下什么是不可变对象:一旦对象被创建并初始化后,内部的状态数据就会保持不变。查看 JDK 源码中的 String 类,可以看到类本身被 final 修饰,并且内部的大部分属性都是 final 修饰的,除了字段 hash 是通过字符串内容计算并缓存起来的。这样的行为让 String 类无法被扩展,内部属性也无法被修改。

接着我们再来用画图的形式来说明下 String 的不可变性。

通常我们初始化字符串都是以下形式:

String 类型的引用变量 a 保留了一个字符串对象 string 的引用,就如同下图所示,箭头则表示了变量 a 与真正 String 对象的引用关系。

再通过上述代码,我们将变量 a 赋值给变量 b ,变量 b 也存储了字符串对象 string的引用,它们指向的是同一个对象。

当我们尝试对变量 a 重新赋值,看下对变量 b 会不会有影响呢

想必小伙伴一看就知道,打印的结果肯定是 string2,string,同样用画图的方式展示这两个变量与字符串对象的引用关系。

将变量 a 重新赋值后,保存了新的引用,而不是直接在原有的字符串对象上进行数据改变,同时变量 b 仍然存的是对象 string 的引用,变量 a 和 b 两者相互独立,不影响,这也正是说明了 String 对象的不可变。

在这里初认 Java 的小伙伴还可能会有些困惑:对一个String对象 a 赋值 string,然后又让 a 值为 string2,这个时候a的值变成 了string2, a 的值改变了,为什么还说 String 对象不可变呢。

其实问题也很简单,这里的 a 只是存储 String 对象的引用,并不是对象本身,a 存储的是指向对象所在内存的地址引用罢了,当第二次赋值时,a 引用指向了对象 string2的内存地址,而对象 string2 是重新创建的,之前的 string 对象仍在内存中,并且由变量 b 引用着。

除此之外,String 类的返回 String 对象的方法不会改变自身,都是返回一个新的 String 对象来实现,比如 concat,replace,substring 等等。

以上就是String的不可变介绍,如果有什么关于JAVA的问题,可以私信找我交流,我将尽我可能来解答!学习路线,资料等可找我。

标签: #为什么string可以直接赋值