为了账号安全,请及时绑定邮箱和手机立即绑定

关于字符串的不变性

关于字符串的不变性

qq_不睡觉的怪叔叔_0 2016-07-15 23:07:22
在这个代码中,为什么hobby等于hobby2而不等于hobby3呢?
查看完整描述

3 回答

已采纳
?
冰山点水

TA贡献109条经验 获得超149个赞

第一句代码里面的字符串字面量“play basketball”会作为常量存放在常量池中,当执行第二句代码的时候,JVM发现常量池中有这个字面量,就会直接把引用指向常量池中的这个“play basketball”,也就是两个变量指向同一个内存地址。当执行第三句代码的时候,因为有一个new,不管常量池有没有这个play basketball,都会在堆里面开辟一个新的内存空间存放play basketball,并将hobby3指向这个内存地址,所以hobby==hobby3的结果是false。

查看完整回答
2 反对 回复 2016-07-15
?
看风景非凡

TA贡献9条经验 获得超11个赞

这个不等于是因为在String类中,“==”比较的是他们在内存中的存放地址,你new了一个对象,结果肯定是false,前面两个虽然变量名不一样,但是他们在内存中都指向“Play basketball”,即他们的内存地址是一样的,如果这里你把“==”换成“equals”,结果就是true,因为在String类中,equals比较是他们的值是否相同。(只有在基本数据类型之间的比较中“==”才比较的是他们的值,例如int,double等等,在复合数据类型,即类中,他比较的是内存地址)

查看完整回答
1 反对 回复 2016-07-15
?
y_play

TA贡献3条经验 获得超0个赞

这是因为JVM中有个常量池的概念,它的机制大致就是如果常量池里面有对应的字符串,就不用开辟新的内存空间来创建字符串,如果没有就开辟内存空间来创建你生命的字符串;且用new关键字会强行在内存里面开辟空间,不管常量池中是否有与你需要的字符串。

比如String hobby="Play basketball"这句之后,说明常量池有了"Play basketball"的字符串,而hobby2的 指向/引用 也是常量池中的它,通过==判断的引用,那么hobby和hobby2都是相同的引用,返回true;而hobby3使用了new关键字,会强行开辟内存空间,所以他的 指向/引用 和hobby、hobby2都是不一样的所以是false。

查看完整回答
反对 回复 2016-07-17
  • 3 回答
  • 0 关注
  • 1455 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信