3 回答
TA貢獻109條經驗 獲得超149個贊
第一句代碼里面的字符串字面量“play basketball”會作為常量存放在常量池中,當執行第二句代碼的時候,JVM發現常量池中有這個字面量,就會直接把引用指向常量池中的這個“play basketball”,也就是兩個變量指向同一個內存地址。當執行第三句代碼的時候,因為有一個new,不管常量池有沒有這個play basketball,都會在堆里面開辟一個新的內存空間存放play basketball,并將hobby3指向這個內存地址,所以hobby==hobby3的結果是false。
TA貢獻9條經驗 獲得超11個贊
這個不等于是因為在String類中,“==”比較的是他們在內存中的存放地址,你new了一個對象,結果肯定是false,前面兩個雖然變量名不一樣,但是他們在內存中都指向“Play basketball”,即他們的內存地址是一樣的,如果這里你把“==”換成“equals”,結果就是true,因為在String類中,equals比較是他們的值是否相同。(只有在基本數據類型之間的比較中“==”才比較的是他們的值,例如int,double等等,在復合數據類型,即類中,他比較的是內存地址)
TA貢獻3條經驗 獲得超0個贊
這是因為JVM中有個常量池的概念,它的機制大致就是如果常量池里面有對應的字符串,就不用開辟新的內存空間來創建字符串,如果沒有就開辟內存空間來創建你生命的字符串;且用new關鍵字會強行在內存里面開辟空間,不管常量池中是否有與你需要的字符串。
比如String hobby="Play basketball"這句之后,說明常量池有了"Play basketball"的字符串,而hobby2的 指向/引用 也是常量池中的它,通過==判斷的引用,那么hobby和hobby2都是相同的引用,返回true;而hobby3使用了new關鍵字,會強行開辟內存空間,所以他的 指向/引用 和hobby、hobby2都是不一樣的所以是false。
添加回答
舉報
