JAVA关于字符串存储位置的讨论

#关于字符串储存在常量池中
JAVA关于字符串存储位置的讨论_第1张图片
问题1:JAVA17的字符串底层是byte数组,而之前是char数组,但是我们已知,JAVA的数组是储存在堆中的,所以常量池的说法,是数组储存在了常量池中,
问题2:String是对象,对象储存在常量池中么?

我的理解

JAVA关于字符串存储位置的讨论_第2张图片
根据这个,==对比的是地址,所以,常量的字符串是存储在相同地址中的
JAVA关于字符串存储位置的讨论_第3张图片
只有当new时,才不存储在同一个地址,因为new是重新开辟了一个空间,创建一个String对象.
而且,根据图1,我们可以得出,当不new时,我们的字符串,都是先去从已知的字符串中遍历一遍是否有当前字符串,如果有,指针直接指向了,如果没有才会重新开辟空间.
假想:堆中存在专门存放字符串的位置,用来存放已知的字符串,为什么这么说呢,看下图,当我们重新创建一个s4,值与s3相同时,并不会遍历s3,所以,new出来的,与直接给定的String不在一个空间内,且称为String常量堆吧,当然也可能是一个对象来存放的.
JAVA关于字符串存储位置的讨论_第4张图片

你可能感兴趣的:(java,jvm,开发语言)