關於String,Integer 使用==比值的問題

String內部維護的是一個Char數組,所以所有的String對象都是一個數組,String 在比較值是否相等的時候也是通過遍歷這個數組進行對比

如果有一個char字符是不等的,則返回 false, 但是比較值的方法 java 中有兩種方式 == 和 equals:

用==比較的時候,如果兩個都是對象,則比較的是地址,如果是基本數據類型則比較的就是本身的值

所以凡是出現 new關鍵字的話 其地址一定不相等,因爲是要在堆內存中開闢地址保存數據的

用==如果是對象和基本數據類型相比的話,比如Integer會自動拆箱成int再和int值比較,所以本質上還是int和int的值比較

String 的話用==比較的首先是地址,但是String會有一個緩存機制,也就是常量池,1.7以後的常量池是在堆內存中

String 對象進入常量池有兩種方法,一種是 顯示聲明,就是雙引號,一種是intern方法

上面就是顯示聲明,就是雙引號直接賦值一個字符串給變量,編譯器看到這種就會直接放入常量池中,下次有變量再顯示聲明

就會直接取常量池裏的對象,所以是同一個對象,地址也相等

如果是new的話,肯定不等,因爲是在內存中兩個不同的地方,地址肯定不等,但如果用intern這個方法,這個方法會從常量池裏

找到字符串的值然後返回,如果常量池裏沒有,就會新加入這個字符串“abc”然後再返回回來,所以無論如何都會返回這個字符串,而常量池裏也一定會因爲這個動作而存在這個字符串“abc”,注意:

new String("abc")

這種也是會顯示聲明字符串“abc”的,所以這個時候常量池中已經有了“abc”

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