關於String的面試題和==和equals的更加詳細說明

  1. 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” s3
s2? s3.equals(s2)?**
false ture
字符串拼接是通過tostring完成的,即s3的地址爲toString的地址

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章