1.String类的特点
1.java程序中,只要是双引号字符串,就都是String类的对象 如图
只有String这一个类有这种特殊的创建对象方法
我们知道,只有对象才可以通过 点什么来调用方法,而图中s.toString等方法都可以调用,所以s就是String的对象
.
2.字符串在创建之后,内容不可更改 如图
这该如何解释?我们不妨先看看下图
上图中,stu原本是18,张三的,但是却被新创建的对象20,李四给覆盖掉了,导致最终打印出来的是新的对象
所以,上图中的s并不是被改变了内容,而是因为"def"也是双引号字符串,也是一个新的对象,s被新的对象覆盖了,所以打印的是def,但原来的"abc"是没有被改变的
3.String字符串虽然不能改变,但可以共享
如图 打印出来的是false还是true呢?
答案是true,在回答为什么是true之前,我们需要知道一个新的知识——字符串常量池
4.字符串常量池
我们使用内存图对刚才的s1,s2比较进行解释
当执行到s1时,创建出双引号对象"abc",这时,程序会去字符串常量池检查是否有"abc"这个对象,发现没有abc,所以在字符串常量池里创建"abc",然后产生地址,记录给s1
接着执行s2,还是创建双引号对象"abc",程序依旧去字符串常量池检查是否有"abc"这个对象,这时发现存在,那就直接把地址赋给s2
s1和s2的地址都一致,引用数据类型使用==进行比较,比较的是地址值,所以打印的true
.