最近在复习B站韩老师的0基础java视频在复习到String字符串这里的时候看到笔记上记了这么一句话:
String 有属性 private final char value[]; 用于存放字符串内容,并且是final修饰的,说明他的值在赋值之后就不可以修改了.
即 value 不能指向 新的地址,但是单个字符内容是可以变化
关于这句话的后半部分理解不是很清楚
既然value字符串数组都已经被final修饰了那就说明我们无法修改value指向的字符串数组的地址值,如果按照他说的对value指向的地址值对应的数组进行操作,那我们也是接触不到这个真正的字符串数组的啊 用什么方法去修改字符串数组中的某个值呢? 使用反射暴破?
如果可以反射爆破不就和String不可变这个概念冲突了吗?
如果不能修改,为什么又要说 value 不能指向 新的地址,但是单个字符内容是可以变化 这句话呢 ?
你先别管字符串不字符串的
数组的地址和数组里面存的值是怎么回事,你现在还一团乱呢
我给你举个例子,你看看能不能想明白。
你是个库管员,你管一个仓库,仓库里有一排排的货架,你想象成超市的货架也行。
现在你定义了一个数组,相当于来了一批货,这个货放到货架上之后,位置就不可以再变了,永远只能放到这个货架上,这就叫地址不可修改
但是货架上的货物总在进进出出,来了又走,这就是内容可以变化
那么最后,String类型就是一个标签,它标记了货物名称,它就永远指向这排货架。
你改变字符串,就是修改了这个标签,你只是把它指向了另一排货架,而不可能改变货架本身。
private final char value[];
是一个常量字符数组,
常量的意思是,数组的引用(地址/指针)不能被更改,但是,没有规定数组的内容不可以更改。
数组的意思是,相同类型的数据按照先后顺序在内存中依次存放的一种数据形式。
变量value被final修饰之后,value的值不能被改变,而value的值就是数组的引用(或者说地址/指针),
而数组的内容可以通过下角标进行访问。
例如:
final char test[] = new char[]{'a','b','c'};
// 这时如果执行 test = null; 或者 test = new char[]{'1'}; 是语法不允许的,因为已经被final修饰。
// 但是,你可以改变数组内的数据...
test[0] = '1';
test[1] = '2';
// 这时, test 数组的内容是 {'1','2','c'}