3 回答

TA貢獻109條經(jīng)驗 獲得超149個贊
第一句代碼里面的字符串字面量“play basketball”會作為常量存放在常量池中,當執(zhí)行第二句代碼的時候,JVM發(fā)現(xiàn)常量池中有這個字面量,就會直接把引用指向常量池中的這個“play basketball”,也就是兩個變量指向同一個內(nèi)存地址。當執(zhí)行第三句代碼的時候,因為有一個new,不管常量池有沒有這個play basketball,都會在堆里面開辟一個新的內(nèi)存空間存放play basketball,并將hobby3指向這個內(nèi)存地址,所以hobby==hobby3的結果是false。

TA貢獻9條經(jīng)驗 獲得超11個贊
這個不等于是因為在String類中,“==”比較的是他們在內(nèi)存中的存放地址,你new了一個對象,結果肯定是false,前面兩個雖然變量名不一樣,但是他們在內(nèi)存中都指向“Play basketball”,即他們的內(nèi)存地址是一樣的,如果這里你把“==”換成“equals”,結果就是true,因為在String類中,equals比較是他們的值是否相同。(只有在基本數(shù)據(jù)類型之間的比較中“==”才比較的是他們的值,例如int,double等等,在復合數(shù)據(jù)類型,即類中,他比較的是內(nèi)存地址)

TA貢獻3條經(jīng)驗 獲得超0個贊
這是因為JVM中有個常量池的概念,它的機制大致就是如果常量池里面有對應的字符串,就不用開辟新的內(nèi)存空間來創(chuàng)建字符串,如果沒有就開辟內(nèi)存空間來創(chuàng)建你生命的字符串;且用new關鍵字會強行在內(nèi)存里面開辟空間,不管常量池中是否有與你需要的字符串。
比如String hobby="Play basketball"這句之后,說明常量池有了"Play basketball"的字符串,而hobby2的 指向/引用 也是常量池中的它,通過==判斷的引用,那么hobby和hobby2都是相同的引用,返回true;而hobby3使用了new關鍵字,會強行開辟內(nèi)存空間,所以他的 指向/引用 和hobby、hobby2都是不一樣的所以是false。
添加回答
舉報