关于字符串的不变性

http://img.mukewang.com/5788fbea0001665803130076.jpg

在这个代码中,为什么hobby等于hobby2而不等于hobby3呢?

qq_不睡觉的怪叔叔_0
浏览 1456回答 3
3回答

冰山点水

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

看风景非凡

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

y_play

这是因为JVM中有个常量池的概念,它的机制大致就是如果常量池里面有对应的字符串,就不用开辟新的内存空间来创建字符串,如果没有就开辟内存空间来创建你生命的字符串;且用new关键字会强行在内存里面开辟空间,不管常量池中是否有与你需要的字符串。比如String hobby="Play basketball"这句之后,说明常量池有了"Play basketball"的字符串,而hobby2的 指向/引用 也是常量池中的它,通过==判断的引用,那么hobby和hobby2都是相同的引用,返回true;而hobby3使用了new关键字,会强行开辟内存空间,所以他的 指向/引用 和hobby、hobby2都是不一样的所以是false。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java