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”