java:源码解读String类的不可变特性

String类不可变的含义
String对象创建之后便不会再改变,任何看起来的变化都是通过创建新的String对象来完成的。

举例:

String a = new String("abc");
a = a + "d";

第一个语句创建了一个String 对象abc,a是指向这个对象的引用

第二个语句右边创建了另外一个String对象abcd;

执行第二个语句时,并不会修改原先的对象abc;
在这里插入图片描述
不可变是如何实现的
这里有三个关键点:

1、String类被final修饰,不可被继承;因为一旦允许继承的化,那么方法就有可能被重写,也就有可能会破坏不可变性,这就是为什么用final修饰的原因;

2、private final修饰char[] 数组;字符串底层使用字符数组来存储,这个字符数组通过private final修饰,防止外部对字符串做出改变;

3、String类种的任何方法都不会对字符串进行改动;
在这里插入图片描述
为什么设计为不可变的
主要还是为了性能方面的考虑,因为在java语言设计之初,就认为String将会被频繁的使用,所以设定了常量池,目的是为了尽可能的复用已有对象,这就要求已有对象是不可变的;
在这里插入图片描述

当然设计成不可变对象,一定程度上也可以增加代码的安全性,比如可变对象作为hashMap的key时,如果先放入map之后,再改变对象,那么可能就会破坏Map对key的唯一性要求;

零基础学习Java编程,可以加入我的十年Java学习园地。技术交流,资源共享,解疑答惑,经验分下。

猜你喜欢

转载自blog.csdn.net/weixin_49794051/article/details/112864511