- String s1=new String(“abc”)創建了幾個對象?
我們知道在內存中有棧、堆、常量池
那麼就好說了。
1.現在棧中創建一個String s1
2.然後常量池中創建"abc"
3.new String 就是在堆中創建一個對象
4.將常量池"abc"拿出來賦值給堆的new String 再將堆的地址傳給String s1
常量池”abc“ 和 new String 是兩個對象
2.S1="abc“;S2="abc"s1==s2? s1.equals(s2)? 兩個都是ture
- ==可以比較基本數據類型和引用類型變量
基本數據類型的變量,則直接比較其存儲的 “值”是否相等
引用類型比較的是地址,String是引用型比較地址 abc的地址爲同一個。 - .equals比較的是對象
將當前對象(S1)和(S2)比較,當兩個字符串一樣時才返回ture
3.s1=new String(“abc”); s2="abc"s1==s2? s1.equals(s2)?
==false
equals ture
- == 由上題知,引用類型比較的是地址。s1的地址爲堆內存地址,s2爲常量池地址
4.s1=“a”+“b”+“c”; s2="abc"s1==s2? s1.equals(s2)? 還是兩個ture
這裏很多人會有疑問了。不應該是false麼
這裏涉及到JAVA的常量優化機制
在編譯時s1=“abc”,當到了s2時,常量池中有”abc“直接用
所以 s1 == s2 是同一地址返回ture
5.**s1=“ab”;s2"abc";s3=s1+“c” s3s2? s3.equals(s2)?**
false ture
字符串拼接是通過tostring完成的,即s3的地址爲toString的地址