猿问
回到首页
个人中心
反馈问题
注册登录
下载APP
首页
课程
实战
体系课
手记
专栏
慕课教程
关于字符串的不变性
在这个代码中,为什么hobby等于hobby2而不等于hobby3呢?
qq_不睡觉的怪叔叔_0
浏览 1456
回答 3
3回答
冰山点水
第一句代码里面的字符串字面量“play basketball”会作为常量存放在常量池中,当执行第二句代码的时候,JVM发现常量池中有这个字面量,就会直接把引用指向常量池中的这个“play basketball”,也就是两个变量指向同一个内存地址。当执行第三句代码的时候,因为有一个new,不管常量池有没有这个play basketball,都会在堆里面开辟一个新的内存空间存放play basketball,并将hobby3指向这个内存地址,所以hobby==hobby3的结果是false。
2
0
0
看风景非凡
这个不等于是因为在String类中,“==”比较的是他们在内存中的存放地址,你new了一个对象,结果肯定是false,前面两个虽然变量名不一样,但是他们在内存中都指向“Play basketball”,即他们的内存地址是一样的,如果这里你把“==”换成“equals”,结果就是true,因为在String类中,equals比较是他们的值是否相同。(只有在基本数据类型之间的比较中“==”才比较的是他们的值,例如int,double等等,在复合数据类型,即类中,他比较的是内存地址)
1
0
0
y_play
这是因为JVM中有个常量池的概念,它的机制大致就是如果常量池里面有对应的字符串,就不用开辟新的内存空间来创建字符串,如果没有就开辟内存空间来创建你生命的字符串;且用new关键字会强行在内存里面开辟空间,不管常量池中是否有与你需要的字符串。比如String hobby="Play basketball"这句之后,说明常量池有了"Play basketball"的字符串,而hobby2的 指向/引用 也是常量池中的它,通过==判断的引用,那么hobby和hobby2都是相同的引用,返回true;而hobby3使用了new关键字,会强行开辟内存空间,所以他的 指向/引用 和hobby、hobby2都是不一样的所以是false。
0
0
0
打开App,查看更多内容
随时随地看视频
慕课网APP
相关分类
Java
继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续