value不能指向新地址
演示案例
练习题
堆中的数组可以改变该对象的内容,
常量池中的字符串不能改变内容,只能指向新的字符串
下图是new ex 后的内存图
调用change后的内存图
首先str的指向发生改变,因为hsp是常量池里字符串不能改变,所以只能新建出Java这个字符串,把str原先指向hsp改成指向Java
其次修改数组ch,因为ch在堆中是可以修改的,所以把ch的java改成了hava
change方法执行完毕后,change空间销毁,但是修改的还是会保留
ex的str指向还是不变(指向hsp),ex的ch指向发生变化(指向hava)
两种创建String对象区别![](https://img-blog.csdnimg.cn/cdaaaada62014e7ba4c087989a11caf7.jpeg)
方式1:如果常量池有hsp,s就直接指向常量池里的hsp。
如果常量池没有hsp,先在常量池新建一个hsp再用s指向hsp
方式2:现在堆中建立value数组,用value数组指向hsp
练习题1
a和b内容相等,equals结果为true
a和b指向的都是常量池里的“abc”,地址相同,==结果为true
练习题2
练习题3
要注意p1.name==p2.name比较的是p1.name和p2.name指向谁,而不是p1和p2指向谁
p1.name和p2.name都指向常量池的hspedu,所以==为true
而s1==s2中,s1指向s1在堆中创造的value数组(可以称之为v1),s2指向s2在堆中创造的value数组(可以称之为v2),所以s1==s2为false
Intern方法
在这里,因为a已经在常量池创建了“hsp”,所以b.intern直接指向常量池中的“hsp”。
所以a和b.intern指向的是同一个东西,==为true
但是b指向堆中的value,b.intern指向的是常量池,所以==为false
字符串特性:常量相加看常量池,变量相加是在堆中
常量相加看常量池
变量相加是在堆中
当变量c = 变量a+变量b,会先把a和b指向的对象存放在堆的value中,最后再调用tostring方法生成新的常量值helloabc然后指向它
内存图
String常用方法
4和5:找不到返回-1
第二组
format使用案例
拿到一个名字,先用空格把名字划分三个部分
names【0】=Han, names【1】=shun, names【2】=Ping
因为要求的是变成Ping,Han.S,所以Ping,Han都是String用%s,而S是char类型所以要用%c
最后结果:formate=Ping,Han.S